есть стандартный фрагмент кода из канала awk под названием FindAllMatches
, но он все еще очень ручной, буквально, просто длинные циклы while()
, match()
, substr()
, еще substr()
, затем промойте и повторите.
Если вы ищете идеи о том, как получить только согласованные части, но со сложным регулярным выражением, которое несколько раз соответствует каждой строке или вообще не соответствует ни одной, попробуйте следующее:
mawk/mawk2/gawk 'BEGIN { srand(); for(x = 0; x < 128; x++ ) {
alnumstr = sprintf("%s%c", alnumstr , x)
};
gsub(/[^[:alnum:]_=]+|[AEIOUaeiou]+/, "", alnumstr)
# resulting str should be 44-chars long :
# all digits, non-vowels, equal sign =, and underscore _
x = 10; do { nonceFS = nonceFS substr(alnumstr, 1 + int(44*rand()), 1)
} while ( --x ); # you can pick any level of precision you need.
# 10 chars randomly among the set is approx. 54-bits
#
# i prefer this set over all ASCII being these
# just about never require escaping
# feel free to skip the _ or = or r/t/b/v/f/0 if you're concerned.
#
# now you've made a random nonce that can be
# inserted right in the middle of just about ANYTHING
# -- ASCII, Unicode, binary data -- (1) which will always fully
# print out, (2) has extremely low chance of actually
# appearing inside any real word data, and (3) even lower chance
# it accidentally alters the meaning of the underlying data.
# (so intentionally leaving them in there and
# passing it along unix pipes remains quite harmless)
#
# this is essentially the lazy man's approach to making nonces
# that kinda-sorta have some resemblance to base64
# encoded, without having to write such a module (unless u have
# one for awk handy)
regex1 = (..); # build whatever regex you want here
FS = OFS = nonceFS;
} $0 ~ regex1 {
gsub(regex1, nonceFS "&" nonceFS); $0 = $0;
# now you've essentially replicated what gawk patsplit( ) does,
# or gawk's split(..., seps) tracking 2 arrays one for the data
# in between, and one for the seps.
#
# via this method, that can all be done upon the entire $0,
# without any of the hassle (and slow downs) of
# reading from associatively-hashed arrays,
#
# simply print out all your even numbered columns
# those will be the parts of "just the match"
если вы также запустите еще один OFS = ""; $1 = $1;
, теперь вместо того, чтобы требовать 4-аргумента split()
или patsplit()
, оба из которых специфичны для gawk, чтобы увидеть, каковы были разделители регулярных выражений, теперь все поля $0
находятся в data1-sep1-data2-sep2 -... . pattern, ..... все время $0
будет выглядеть ТОЧНО так же, как когда вы впервые читаете строку. прямой print
будет побайтно идентично печати сразу после чтения.
Как только я протестировал его до крайности, используя регулярное выражение, которое представляет действительные символы UTF8 на этом. Потребовалось около 30 секунд, чтобы mawk2 обработал текстовый файл размером 167 МБ с большим количеством юникода CJK повсюду, все прочитал сразу в 0 долларов и запустил эту логику разделения, в результате чего NF составил около 175000000, и каждое поле было однозначным. символ ASCII или многобайтового Unicode UTF8.
person
RARE Kpop Manifesto
schedule
05.05.2021