пСЙНБНДЯРБН ОНКЭГНБЮРЕКЪ ДКЪ GNU Awk

Arnold D. Robbins
ОЕПЕБНД аЮКСЕБЮ ю. м.

нЦКЮБКЕМХЕ

16. оПЮЙРХВЕЯЙХЕ awk-ОПНЦПЮЛЛШ

щРЮ ЦКЮБЮ ОПЕДЯРЮБКЪЕР ОНОСППХ ХГ awk-ОПНЦПЮЛЛ ДКЪ МЮЯКЮФДЕМХЪ ХУ ВРЕМХЕЛ. нМЮ ЯНЯРНХР ХГ ДБСУ ВЮЯРЕИ. оЕПБЮЪ ЯНДЕПФХР awk-БЕПЯХХ МЕЯЙНКЭЙХУ НАЫХУ СРХКХР POSIX. бН БРНПНИ ЯНАПЮМШ ПЮГМШЕ ХМРЕПЕЯМШЕ ОПНЦПЮЛЛШ. лМНЦХЕ ХГ МХУ ХЯОНКЭГСЧР АХАКХНРЕВМШЕ ТСМЙЖХХ, ОПЕДЯРЮБКЕММШЕ Б цКЮБЕ 15 [аХАКХНРЕЙЮ awk-ТСМЙЖХИ], ЯРП. 169.

16.1 оЕПЕ ХГНАПЕРЕМХЕ ЙНКЕЯЮ ДКЪ ГЮАЮБШ Х ОНКЭГШ

б МЮВЮКН ЯРПЮМХЖШ

б ЩРНЛ ПЮГДЕКЕ ЯНАПЮМШ МЕЯЙНКЭЙН СРХКХР POSIX, ЙНРНПШЕ ПЕЮКХГНБЮМШ ЯПЕДЯРБЮЛХ awk. оЕПЕ ХГНАПЕРЕМХЕ ЩРХУ ОПНЦПЮЛЛ Б awk ВЮЯРН ГЮАЮБМН, ОНЯЙНКЭЙС ЮКЦНПХТЛШ ЛНЦСР АШРЭ НВЕМЭ ЪЯМН БШПЮФЕМШ Х НАШВМН ХУ ЙНДШ НВЕМЭ БШПЮГХРЕКЭМШ Х ОПНЯРШ. щРН ВХЯРЮЪ ОПЮБДЮ, ОНРНЛС ВРН awk ДЕКЮЕР ДКЪ БЮЯ НВЕМЭ ЛМНЦН.

мСФМН ГЮЛЕРХРЭ, ВРН ЩРХ ОПНЦПЮЛЛШ БНБЯЕ МЕ НАЪГЮРЕКЭМН ОПЕДМЮГМЮВЕМШ ДКЪ ГЮЛЕМШ СЯРЮМНБКЕММШУ БЕПЯХИ Б БЮЬЕИ ЯХЯРЕЛЕ. мЮНАНПНР, ХУ ЖЕКЭ --- ОПНХККЧЯРПХПНБЮРЭ ОПНЦПЮЛЛХПНБЮМХЕ МЮ ЪГШЙЕ awk ЮКЦНПХТЛНБ ДКЪ ПЕЮКЭМШУ ГЮДЮВ.

оПНЦПЮЛЛШ ПЮЯОНКНФЕМШ Б ЮКТЮБХРМНЛ ОНПЪДЙЕ.

16.1.1 бШПЕГЮМХЕ ОНКЕИ Х ЙНКНМНЙ

б МЮВЮКН ЯРПЮМХЖШ

сРХКХРЮ cut БШДЕКЪЕР ХКХ "БШПЕГЮЕР" ЯХЛБНКШ ХКХ ОНКЪ ХГ ХУ ЯРЮМДЮПРМНЦН ББНДЮ Х ОНЯШКЮЕР Б ЯРЮМДЮПРМШИ БШБНД. cut ЛНФЕР БШПЕГЮРЭ ХКХ ЯОХЯНЙ ЯХЛБНКНБ ХКХ ЯОХЯНЙ ОНКЕИ. оН СЛНКВЮМХЧ ОНКЪ ПЮГДЕКЪЧРЯЪ ЯХЛБНКЮЛХ tab, МН БШ ЛНФЕРЕ СЙЮГЮРЭ Б ОЮПЮЛЕРПЕ ЙНЛЮМДМНИ ЯРПНЙХ ДПСЦНИ ЯХЛБНК ЙЮЙ ПЮГДЕКХРЕКЭ ОНКЕИ. б cut НОПЕДЕКЕМХЕ ОНКЕИ ЛЕМЕЕ НАЫЕЕ ВЕЛ Б awk. cut ЛНФЕР РНКЭЙН ХГБКЕВЭ ПЕЦХЯРПЮЖХНММНЕ ХЛЪ ГЮПЕЦХЯРПХПНБЮММНЦН ОНКЭГНБЮРЕКЪ ХГ БУНДЮ who. мЮОПХЛЕП, ЯКЕДСЧЫХИ ЙНМБЕИЕП ЦЕМЕПХПСЕР НРЯНПРХПНБЮММШИ ЕДХМШИ ЯОХЯНЙ ПЮАНРЮЧЫХУ ОНКЭГНБЮРЕКЕИ:

who -- cut -c1-8 -- sort -- uniq

оЮПЮЛЕРПШ ДКЪ cut ЯКЕДСЧЫХЕ: -c list

хЯОНКЭГСЕР list ЙЮЙ ЯОХЯНЙ ЯХЛБНКНБ ДКЪ БШПЕГЮМХЪ (to cut out). щКЕЛЕМРШ Б ЯОХЯЙЕ ЛНЦСР ПЮГДЕКЪРЭЯЪ ГЮОЪРШЛХ, Ю ДХЮОЮГНМШ ЯХЛБНКНБ ЛНЦСР ПЮГДЕКЪРЭЯЪ ЯХЛБНКЮЛХ ЛХМСЯЮ. яОХЯНЙ `1-8,15,22-35' ЯНДЕПФХР ЯХЛБНКШ НР 1 ДН 8, 15 Х НР 22 ДН 35.

-f list

хЯОНКЭГСЕР list ЙЮЙ ЯОХЯНЙ ОНКЕИ ДКЪ БШПЕГЙХ.

-d delim

хЯОНКЭГСЕР delim ЙЮЙ ЯХЛБНК-ПЮГДЕКХРЕКЭ ОНКЕИ БЛЕЯРН tab

-s

оНДЮБКЪЕР ОЕВЮРЭ ЯРПНЙ, МЕ ЯНДЕПФЮЫХУ ПЮГДЕКХРЕКЕИ ОНКЕИ.

awk-ПЕЮКХГЮЖХЪ cut ХЯОНКЭГСЕР АХАКХНРЕВМСЧ ТСМЙЖХЧ getopt (ЯЛ. ПЮГДЕК 15.10 [нАПЮАНРЙЮ ОЮПЮЛЕРПНБ ЙНЛЮМДМНИ ЯРПНЙХ], ЯРП. 186), АХАКХНРЕВМСЧ ТСМЙЖХЧ join (ЯЛ. ПЮГДЕК 15.6 [яНЕДХМЕМХЕ ЩКЕЛЕМРНБ ЛЮЯЯХБЮ Б ЖЕОНВЙС], ЯРП. 176).

оПНЦПЮЛЛЮ МЮВХМЮЕРЯЪ Я ЙНЛЛЕМРЮПХЪ, НОХЯШБЮЧЫЕЦН ОЮПЮЛЕРПШ Х ТСМЙЖХЧ usage, ЙНРНПЮЪ ОЕВЮРЮЕР ЯННАЫЕМХЕ Х ОПЕЙПЮЫЮЕР ПЮАНРС. usage БШГШБЮЕРЯЪ, ЕЯКХ НАМЮПСФЕМШ МЕБЕПМШЕ ЮПЦСЛЕМРШ.

# cut.awk --- ПЕЮКХГЮЖХЪ cut Б awk
# Arnold Robbins, arnold@gnu.org, Public Domain 
# May 1993
# оЮПЮЛЕРПШ: 
# -f list Cut fields 
# -d c яХЛБНК ПЮГДЕКХРЕКЭ ОНКЕИ
# -c list Cut characters 
# # -s оНДЮБКЪЕР ЯРПНЙХ АЕГ ЯХЛБНКНБ-ПЮГДЕКХРЕКЕИ
function usage( e1, e2) -
e1 = "usage: cut [-f list] [-d c] [-s] [files...]"
e2 = "usage: cut [-c list] [files...]" print e1 ? "/dev/stderr"
print e2 ? "/dev/stderr" exit 1 ""

оЕПЕЛЕММШЕ e1 Х e2 ХЯОНКЭГСЧРЯЪ ДКЪ СДНАМНЦН ПЮЯОНКНФЕМХЪ ДЮММШУ МЮ ЯРПЮМХЖЕ.

дНКЕЕ ХДЕР ОПЮБХКН BEGIN, ЙНРНПНЕ ЮМЮКХГХПСЕР ОЮПЮЛЕРПШ ЙНЛЮМДМНИ ЯРПНЙХ. нМН ГЮМНЯХР Б FS НДХМ ЯХЛБНК tab, ПЮГДЕКХРЕКЭ ОНКЕИ ОН СЛНКВЮМХЧ. пЮГДЕКХРЕКЭ БШУНДМШУ ОНКЕИ СЯРЮМЮБКХБЮЕРЯЪ РНР ФЕ ВРН Х МЮ БУНДЕ. гЮРЕЛ ХЯОНКЭГСЕРЯЪ getopt ДКЪ ЮМЮКХГЮ ОЮПЮЛЕРПНБ Б ЙНЛЮМДМНИ ЯРПНЙЕ. нДМЮ ХГ ОЕПЕЛЕММШУ by.fields ХКХ by.chars СЯРЮМЮБКХБЮЕРЯЪ Б true, ДКЪ СЙЮГЮМХЪ, ВРН НАПЮАНРЙЮ АСДЕР ХДРХ ОН ОНКЪЛ ХКХ ОН ЯХЛБНКЮЛ ЯННРБЕРЯРБЕММН. оПХ БШПЕГЙЕ ОН ЯХЛБНКЮЛ ПЮГДЕКХРЕКЭ БШУНДМШУ ОНКЕИ СЯРЮМЮБКХБЮЕРЯЪ Б ОСЯРСЧ ЖЕОНВЙС.

BEGIN " -
FS = ""t" # ОН СЛНКВЮМХЧ  OFS = FS
while ((c = getopt(ARGC, ARGV, "sf:c:d:")) != -1) -
if (c == "f") -
by.fields = 1 fieldlist = Optarg
"" else if (c == "c") -
by.chars = 1 fieldlist = Optarg OFS = "" "" else if (c == "d") -
if (length(Optarg) ? 1) -
printf("Using first character of %s" " "
for delimiter"n", Optarg) ? "/dev/stderr" Optarg = substr(Optarg, 1, 1) ""
FS = Optarg OFS = FS if (FS == " ") # НРЛЕМЮ ЯЕЛЮМРХЙХ awk
FS = "[ ]" "" else if (c == "s")
suppress++ else
usage() ""
for (i = 1; i ! Optind; i++)
ARGV[i] = ""

НЯНАШИ ЯКСВЮИ ЯНЯРЮБКЪЕР ОПНАЕК ЙЮЙ ПЮГДЕКХРЕКЭ ОНКЕИ. хЯОНКЭГНБЮМХЕ " " (НДХМ ОПНАЕК) ЙЮЙ ГМЮВЕМХЕ FS МЕОПЮБХКЭМН--awk АСДЕР ПЮГДЕКЪРЭ ОНКЪ ЦПСООЮЛХ ОПНАЕКНБ, tab Х/ХКХ newlines, Ю ЛШ УНРХЛ ПЮГДЕКЕМХЪ НДМХЛ ОПНАЕКНЛ. гЮЛЕРХЛ РЮЙФЕ, ВРН ОНЯКЕ ЙНМЖЮ ПЮАНРШ getopt ЛШ ДНКФМШ НВХЯРХРЭ БЯЕ ЩКЕЛЕМРШ ARGV НР ОЕПБНЦН ДН Optind, ВРНАШ awk МЕ ОШРЮКЮЯЭ НАПЮАНРЮРЭ ОЮПЮЛЕРПШ ЙНЛЮМДМНИ ЯРПНЙЮЛХ ЙЮЙ ХЛЕМЮ ТЮИКНБ.

оНЯКЕ НЙНМВЮМХЪ ДЕИЯРБХИ МЮД ОЮПЮЛЕРПЮЛХ ЙНЛЮМДМНИ ЯРПНЙХ, ОПНЦПЮЛЛЮ ОПНБЕПЪЕР, ВРН ОЮПЮЛЕРПШ ХЛЕЧР ЯЛШЯК. рНКЭЙН НДХМ ХГ `-c' Х `-f' ДНКФЕМ АШРЭ СЙЮГЮМ, Х НАЮ РПЕАСЧР ЯОХЯНЙ ОНКЕИ. гЮРЕЛ БШГШБЮЕРЯЪ ХКХ set.fieldlist ХКХ set.charlist ДКЪ БШДЕКЕМХЪ ЯОХЯЙЮ ОНКЕИ ХКХ ЯХЛБНКНБ.

if (by.fields && by.chars)
usage()
if (by.fields == 0 && by.chars == 0)
by.fields = 1 # default
if (fieldlist == "") -
print "cut: needs list for -c or -f" ? "/dev/stderr" exit 1 ""
if (by.fields)
set.fieldlist() else
set.charlist() ""

оСЯРЭ АСДЕР set.fieldlist. рНЦДЮ ЯМЮВЮКЮ ЯОХЯНЙ ОНКЕИ ПЮЯЫЕОКЪЕРЯЪ ОН ГЮОЪРШЛ Б ЙНЛОНМЕМРШ ЛЮЯЯХБЮ. гЮРЕЛ, ДКЪ ЙЮФДНЦН ЩКЕЛЕМРЮ ЛЮЯЯХБЮ, ОПНБЕПЪЕРЯЪ, ВРН ЩРН ДЕИЯРБХРЕКЭМН ДХЮОЮГНМ, Х ЕЯКХ РЮЙ, РН НМ НРЙКЮДШБЮЕРЯЪ Б ЯРНПНМС. дХЮОЮГНМ ОПНБЕПЪЕРЯЪ, ВРНА АШРЭ СБЕПЕММШЛ, ВРН ОЕПБНЕ ВХЯКН ЛЕМЭЬЕ БРНПНЦН. йЮФДНЕ ВХЯКН Б ЯОХЯЙЕ ДНАЮБКЪЕРЯЪ Б ЛЮЯЯХБ flist, Б ЙНРНПНЛ ОПНЯРН ЯНАХПЮЧРЯЪ ОНКЪ ДКЪ ОЕВЮРХ. хЯОНКЭГСЕРЯЪ МНПЛЮКЭМНЕ ПЮГДЕКЕМХЕ ОНКЕИ. оПНЦПЮЛЛЮ НЯРЮБКЪЕР ГЮ awk ПЮГДЕКЕМХЕ ОНКЕИ ОПХ ОЕВЮРХ.

function set.fieldlist( n, m, i, j, k, f, g) -
n = split(fieldlist, f, ",") j = 1 
# index in flist for (i = 1; i != n; i++) -
if (index(f[i], "-") != 0) - 
# a range
m = split(f[i], g, "-") if (m != 2 ---- g[1] ?= g[2]) -
printf("bad field list: %s"n",
f[i]) ? "/dev/stderr" exit 1 "" for (k = g[1]; k != g[2]; k++)
flist[j++] = k "" else
flist[j++] = f[i] "" nfields = j - 1 ""

тСМЙЖХЪ set.charlist ЯКНФМЕЕ ВЕЛ set.fieldlist. гДЕЯЭ ХДЕЪ ЯНЯРНХР Б ХЯОНКЭГНБЮМХХ gawk-ОЕПЕЛЕММНИ FIELDWIDTHS (ЯЛ. ПЮГДЕК 5.6 [вРЕМХЕ ДЮММШУ ТХЙЯХПНБЮММНИ ЬХПХМШ], ЯРП. 49), ЦДЕ НОХЯШБЮЕРЯЪ ББНД Я ОНЯРНЪММНИ ЬХПХМНИ. оПХ ХЯОНКЭГНБЮМХХ ЯОХЯЙЮ ЯХЛБНКНБ ЛШ РНВМН ЩРН Х ХЛЕЕЛ.

сЯРЮМНБЙЮ FIELDWIDTHS АНКЕЕ ЯКНФМЮ, ВЕЛ ОПНЯРН ОЕПЕВХЯКЕМХЕ ОНКЕИ, ЙНРНПШЕ ДНКФМШ АШРЭ МЮОЕВЮРЮМШ. лШ ДНКФМШ ЯКЕДХРЭ ГЮ ОНКЪЛХ ДКЪ ОЕВЮРХ Х РЮЙФЕ ГЮ ОПНЛЕФСРНВМШЛХ ЯХЛБНКЮЛХ, ЙНРНПШЕ ДНКФМШ АШРЭ ОПНОСЫЕМШ. мЮОПХЛЕП, ОПЕДОНКНФХЛ, БШ ХЫЕРЕ ЯХЛБНКШ НР 1 ДН 9, 15, Х НР 222 ДН 35. бШ ДНКФМШ ХЯОНКЭГНБЮРЭ `-c 1-8,15,22-35'. мЕНАУНДХЛНЕ ГМЮВЕМХЕ ДКЪ FIELDWIDTHS АСДЕР "8 6 1 6 14". щРН ДЮЕР МЮЛ ОЪРЭ ОНКЕИ, Х ДНКФМШ АШРЭ МЮОЕВЮРЮМШ $1, $3 Х $5. оПНЛЕФСРНВМШЕ ОНКЪ ЕЯРЭ "ГЮОНКМХРЕКХ", ЛСЯНП ЛЕФДС МСФМШЛХ ДЮММШЛХ.

flist ОЕПЕВХЯКЪЕР ОНКЪ ДКЪ ОЕВЮРХ, Ю t ЯКЕДХР ГЮ ОНКМШЛ ЯОХЯЙНЛ ОНКЕИ, БЙКЧВЮЪ ОНКЪ-ГЮОНКМХРЕКХ.

function set.charlist( field, i, j, f, g, t,
filler, last, len) -
field = 1 # count total fields n = split(fieldlist, f, ",")
j = 1 # index in flist
for (i = 1; i != n; i++) -
if (index(f[i], "-") != 0) - # ДХЮОЮГНМ
m = split(f[i], g, "-") if (m != 2 ---- g[1] ?= g[2]) -
printf("bad character list: %s"n",
f[i]) ? "/dev/stderr" exit 1 "" len = g[2] - g[1] + 1
if (g[1] ? 1) # compute length of filler
filler = g[1] - last - 1 else
filler = 0 if (filler)
t[field++] = filler t[field++] = len # length of field
last = g[2] flist[j++] = field - 1 "" else -
if (f[i] ? 1)
filler = f[i] - last - 1 else
filler = 0 if (filler)
t[field++] = filler t[field++] = 1 last = f[i] flist[j++] = field -
1 "" "" FIELDWIDTHS = join(t, 1, field - 1) nfields = j - 1 ""

бНР ОПЮБХКН, ОН ЙНРНПНЛС ТЮЙРХВЕЯЙХ НАПЮАЮРШБЮЧРЯЪ ДЮММШЕ. еЯКХ ОЮПЮЛЕРП `-s' АШК ДЮМ, РН suppress АСДЕР ХЛЕРЭ ГМЮВЕМХЕ true. оЕПБШИ НОЕПЮРНП if ОНДРБЕПФДЮЕР, ВРН БУНДМЮЪ ГЮОХЯЭ ДНКФМЮ ХЛЕРЭ ПЮГДЕКХРЕКЭ ОНКЕИ. еЯКХ cut НАПЮАЮРШБЮЕР ОНКЪ, РН suppress ЕЯРЭ true, Х ЯХЛБНК ПЮГДЕКХРЕКЪ ОНКЕИ МЕ БУНДХР Б ГЮОХЯЭ, ЙНЦДЮ ГЮОХЯЭ ОПНОСЯЙЮЕРЯЪ. еЯКХ ГЮОХЯЭ ОПЮБХКЭМЮ, РН Б ЩРНИ РНВЙЕ gawk ПЮГДЕКЪЕР ДЮММШЕ МЮ ОНКЪ, КХАН ХЯОНКЭГСЪ ЯХЛБНК Б FS КХАН ХЯОНКЭГСЪ ОНКЪ ТХЙЯХПНБЮММНИ ЬХПХМШ Х FIELDWIDTHS. жХЙК ПЮЯОПНЯРПЮМЪЕРЯЪ МЮ ЯОХЯНЙ ОНКЕИ, ЙНРНПШЕ ДНКФМШ АШРЭ МЮОЕВЮРЮМШ. еЯКХ ЯННРБЕРЯРБСЧЫЕЕ ОНКЕ ХЛЕЕР Б ЯЕАЕ ДЮММШЕ, НМН ОЕВЮРЮЕРЯЪ. еЯКХ ЯКЕДСЧЫЕЕ ОНКЕ РЮЙФЕ ХЛЕЕР ДЮММШЕ, РН ЯХЛБНК-ПЮГДЕКХРЕКЭ БЯРЮБКЪЕРЯЪ ЛЕФДС ОНКЪЛХ.

- if (by.fields && suppress && $0 !~ FS)
next
for (i = 1; i != nfields; i++) -
if ($flist[i] != "") -
printf "%s", $flist[i] if (i ! nfields && $flist[i+1] != "")
printf "%s", OFS "" "" print "" ""

щРЮ БЕПЯХЪ cut НОХПЮЕРЯЪ МЮ gawk-ОЕПЕЛЕММСЧ FIELDWIDTHS, ВРНАШ НЯСЫЕЯРБХРЭ НЯМНБЮММНЕ МЮ ЯХЛБНКЕ БШПЕГЮМХЕ. уНРЪ ЩРН БНГЛНФМН Х Б ДПСЦХУ ПЕЮКХГЮЖХЪУ awk Я ОНЛНЫЭЧ substr (ЯЛ. ПЮГДЕК 12.3 [бЯРПНЕММШЕ ТСМЙЖХХ ДКЪ ДЕИЯРБХИ Я ЖЕОНВЙЮЛХ], ЯРП. 137), ЩРН ДЕКЮРЭ НВЕМЭ АНКЕГМЕММН. оЕПЕЛЕММЮЪ FIELDWIDTHS ОНГБНКЪЕР ЩКЕЦЮМРМН ПЕЬХРЭ ОПНАКЕЛС НРДЕКЕМХЪ БУНДМНИ ЯРПНЙХ НР ЯХЛБНКНБ.

16.1.2 оНХЯЙ ПЕЦСКЪПМШУ БШПЮФЕМХИ Б ТЮИКЮУ

б МЮВЮКН ЯРПЮМХЖШ

сРХКХРЮ egrep ХЫЕР Б ТЮИКЮУ НАПЮГЖШ. нМЮ ХЯОНКЭГСЕР ПЕЦСКЪПМШЕ БШПЮФЕМХЪ, ЙНРНПШЕ ОНВРХ ХДЕМРХВМШ РЕЛ, ЙНРНПШЕ ХЯОНКЭГСЧРЯЪ Б awk (ЯЛ. ПЮГДЕК 7.1.2 [йНМЯРЮМРШ ПЕЦСКЪПМШУ БШПЮФЕМХИ], ЯРП. 77). нМЮ ХЯОНКЭГСЕРЯЪ ЯКЕДСЧЫХЛ НАПЮГНЛ:

egrep [ options ] 'pattern' files ... нАПЮГЕЖ ('pattern') ЕЯРЭ regexp. нАШВМН regexp ГЮЙКЧВЮЕРЯЪ Б ЙЮБШВЙХ, ВРНАШ СДЕПФЮРЭ НАНКНВЙС НР НАПЮАНРЙХ ПЮГКХВМШУ ЯОЕЖХЮКЭМШУ ЯХЛБНКНБ. нАШВМН egrep ОЕВЮРЮЕР ЯРПНЙХ, ЙНРНПШЕ ЯННРБЕРЯРБСЧР НАПЮГЖС. еЯКХ Б ЙНЛЮМДМНИ ЯРПНЙЕ СЙЮГЮМН ЛМНЦН ХЛЕМ ТЮИКНБ, ЙЮФДЮЪ БШУНДМЮЪ ЯРПНЙЮ ОПЕДБЮПЪЕРЯЪ ХЛЕМЕЛ ТЮИКЮ Х ДБНЕРНВХЕЛ.

хЛЕЧРЯЪ ЯКЕДСЧЫХЕ ОЮПЮЛЕРПШ:

-c   оЕВЮРЮРЭ ЙНКХВЕЯРБЮ ЯРПНЙ, НРБЕВЮЧЫХУ НАПЮГЖС, 
	 БЛЕЯРН ЯЮЛХУ ЯРПНЙ.

-s   лНКВЮРЭ Х МХВЕЦН МЕ ОЕВЮРЮРЭ. 
	 рНКЭЙН ЙНД БНГБПЮРЮ СЙЮГШБЮЕР, АШКХ ХКХ МЕР
	 НАМЮПСФЕМШ ЯННРБЕРЯРБХЪ.

-v   нАПЮРХРЭ ЯЛШЯК РЕЯРЮ. egrep ОЕВЮРЮЕР ЯРПНЙХ, 
	 ЙНРНПШЕ МЕ ЯННРБЕРЯРБСЧР
	 НАПЮГЖС Х СЯОЕЬМШИ ЙНД БНГБПЮРЮ НГМЮВЮЕР, 
	 ВРН ЯННРБЕРЯРБХЪ НАПЮГЖС МЕ
	 НАМЮПСФЕМШ.

-i   хЦМНПХПНБЮРЭ ПЮГКХВХЪ Б ПЕЦХЯРПЕ Б НАПЮГЖЕ 
	 Х БУНДМШУ ДЮММШУ.

-l   оПХ ЯННРБЕРЯРБХХ ОЕВЮРЮРЭ РНКЭЙН ХЛЕМЮ ТЮИКНБ, 
	 Б ЙНРНПШУ НАМЮПСФЕМШ
	 ЯННРБЕРЯРБХЪ, Ю МЕ ЯЮЛХ ЯРПНЙХ.

-e pattern     хЯОНКЭГНБЮРЭ  pattern ЙЮЙ  regexp 
	 ДКЪ ЯННРБЕРЯРБХЪ. жЕКЭЧ
	 ОЮПЮЛЕРПЮ `-e' ЪБКЪЕРЯЪ ПЮГПЕЬЕМХЕ 
	 ДКЪ pattern МЮВХМЮРЭЯЪ Я `-'.

щРЮ БЕПЯХЪ ХЯОНКЭГСЕР АХАКХНРЕВМСЧ ТСМЙЖХЧ getopt (ЯЛ. ПЮГДЕК 15.10 [нАПЮАНРЙЮ ОЮПЮЛЕРПНБ ЙНЛЮМДМНИ ЯРПНЙХ], ЯРП. 186), Х АХАКХНРЕВМСЧ ОПНЦПЮЛЛС ЯЛЕМШ ТЮИКНБ (ЯЛ. ПЮГДЕК 15.9 [нАМЮПСФЕМХЕ ЦПЮМХЖ ТЮИКНБ Я ДЮММШЛХ], ЯРП.185). оПНЦПЮЛЛЮ МЮВХМЮЕРЯЪ Я НОХЯЮРЕКЭМШУ ЙНЛЛЕМРЮПХЕБ, ГЮРЕЛ ХДЕР ОПЮБХКН BEGIN, ЙНРНПНЕ НАПЮАЮРШБЮЕР ЮПЦСЛЕМРШ ЙНЛЮМДМНИ ЯРПНЙХ Я ОНЛНЫЭЧ getopt. оЮПЮЛЕРП `-i' (ХЦМНПХПНБЮРЭ ПЕЦХЯРП) СДНБКЕРБНПХРЭ НЯНАЕММН ОПНЯРН Б gawk; ЛШ ОПНЯРН ХЯОНКЭГСЕЛ БЯРПНЕММСЧ ОЕПЕЛЕММСЧ IGNORECASE (ЯЛ. цКЮБС 10 [бЯРПНЕММШЕ ОЕПЕЛЕММШЕ], ЯРП. 115).

# egrep.awk --- ЛНДЕКХПНБЮМХЕ  egrep Б awk
# Arnold Robbins, arnold@gnu.org, Public Domain # May 1993
# Options: 
# -c ЯВХРЮРЭ ЯРПНЙХ 
# -s ЛНКВЮМХЕ - ХЯОНКЭГНБЮРЭ ЙНД БНГБПЮРЮ
# -v НАПЮРМШИ РЕЯР; СЯОЕУ, ЕЯКХ МЕР ЯННРБЕРЯРБХИ
# -i ХЦМНПХПНБЮРЭ ПЕЦХЯРП 
# -l ОЕВЮРЮРЭ РНКЭЙН ХЛЕМЮ ТЮИКНБ
# -e ЮПЦСЛЕМР ЕЯРЭ НАПЮГЕЖ
BEGIN -
while ((c = getopt(ARGC, ARGV, "ce:svil")) != -1) -
if (c == "c")
count.only++ else if (c == "s")
no.print++ else if (c == "v")
invert++
else if (c == "i")
IGNORECASE = 1 else if (c == "l")
filenames.only++ else if (c == "e")
pattern = Optarg else
usage() ""

дЮКЕЕ ЯКЕДСЕР ЙНД, ЙНРНПШИ НАЯКСФХБЮЕР ЯОЕЖХТХВЕЯЙХЕ ЯБНИЯРБЮ egrep. еЯКХ Я `-e' МЕ СЙЮГЮМШ МХЙЮЙХЕ НАПЮГЖШ, РН ХЯОНКЭГСЕРЯЪ ОЕПБШИ МЕ ОЮПЮЛЕРП Б ЙНЛЮМДМНИ ЯРПНЙЕ. юПЦСЛЕМРШ ЙНЛЮМДМНИ ЯРПНЙХ БОКНРЭ ДН ARGV[Optind] НВХЫЮЧРЯЪ, РЮЙ ВРН awk МЕ АСДЕР НАПЮАЮРШБЮРЭ ХУ ЙЮЙ ТЮИКШ. еЯКХ ТЮИКШ МЕ СЙЮГЮМШ, ХЯОНКЭГСЕРЯЪ ЯРЮМДЮПРМШИ ББНД, Ю ЕЯКХ АШКН СЙЮГЮМН МЕЯЙНКЭЙН ТЮИКНБ, ЛШ НАМЮПСФХБЮЕЛ ЩРН Х ДЕКЮЕЛ РЮЙ, ВРНАШ ХЛЕМЮ ТЮИКНБ ОПХ БШБНДЕ ОПЕДЬЕЯРБНБЮКХ ЯРПНЙЮЛ Я ЯННРБЕРЯРБХЪЛХ.

дБЕ ОНЯКЕДМХЕ ЯРПНЙХ ГЮЙНЛЛЕМРХПНБЮМШ, РЮЙ ЙЮЙ НМХ МЕ МСФМШ Б gawk. нМХ ДНКФМШ АШРЭ ГЮДЕИЯРБНБЮМШ, ЕЯКХ ХЯОНКЭГСЕРЯЪ ДПСЦЮЪ БЕПЯХЪ awk.

if (pattern == "")
pattern = ARGV[Optind++]
for (i = 1; i ! Optind; i++)
ARGV[i] = "" if (Optind ?= ARGC) -
ARGV[1] = "-" ARGC = 2 "" else if (ARGC - Optind ? 1)
do.filenames++
# if (IGNORECASE) # pattern = tolower(pattern) ""

яН ЯКЕДСЧЫХУ ЯРПНЙ ЙНЛЛЕМРЮПХИ МСФМН ЯМЪРЭ, ЕЯКХ ХЯОНКЭГСЕРЯЪ МЕ gawk. щРН ОПЮБХКН ОЕПЕБНДХР БЯЕ ЯХЛБНКШ БУНДМНИ ЯРПНЙХ Б МХФМХИ ПЕЦХЯРП, ЕЯКХ АШК СЙЮГЮМ ОЮПЮЛЕРП `-i'. нМН МЕ ЪБКЪЕРЯЪ МЕНАУНДХЛШЛ Б gawk.

#- # if (IGNORECASE) # $0 = tolower($0) #""

тСМЙЖХЪ beginfile БШГШБЮЕРЯЪ ОПЮБХКНЛ `ftrans.awk' ОЕПЕД МЮВЮКНЛ НАПЮАНРЙХ ЙЮФДНЦН МНБНЦН ТЮИКЮ. б МЮЬЕЛ ЯКСВЮЕ НМЮ НВЕМЭ ОПНЯРЮ; МСФМН РНКЭЙН ХМХЖХЮКХГХПНБЮРЭ МСКЕЛ ОЕПЕЛЕММСЧ fcount. нМЮ ЯКЕДХР ГЮ РЕЛ, ЯЙНКЭЙН ЯРПНЙ Б РЕЙСЫЕЛ ТЮИКЕ ЯННРБЕРЯРБСЧР НАПЮГЖС.

function beginfile(junk) -
fcount = 0 ""

тСМЙЖХЪ endfile БШГШБЮЕРЯЪ ОНЯКЕ ГЮБЕПЬЕМХЪ НАПЮАНРЙХ ЙЮФДНЦН ТЮИКЮ. нМЮ ХЯОНКЭГСЕРЯЪ РНКЭЙН РНЦДЮ, ЙНЦДЮ ОНКЭГНБЮРЕКЭ УНВЕР ОНДЯВХРШБЮРЭ ЙНКХВЕЯРБН ЯРПНЙ Я ЯННРБЕРЯРБХЪЛХ. no.print ОНКСВХР ГМЮВЕМХЕ true РНКЭЙН ЕЯКХ МСФЕМ БШУНДМНИ ЯРЮРСЯ. count.only АСДЕР true, ЕЯКХ ОНДЯВЕРШ ЯРПНЙ ФЕКЮРЕКЭМШ. оНЩРНЛС egrep АСДЕР РНКЭЙН ОЕВЮРЮРЭ ЯВЕРВХЙ ЯРПНЙ, ЕЯКХ ГЮДЕИЯРБНБЮМШ ОЕВЮРЭ Х ЯВЕР. бШУНДМНИ ТНПЛЮР ДНКФЕМ АШРЭ БШАПЮМ Б ГЮБХЯХЛНЯРХ НР РНЦН, ЯЙНКЭЙН ТЮИКНБ АСДСР НАПЮАЮРШБЮРЭЯЪ. б ЙНМЖЕ fcount ДНАЮБКЪЕРЯЪ Й total, Х ЛШ СГМЮЕЛ, ЯЙНКЭЙН БЯЕЦН ЯРПНЙ ЯННРБЕРЯРБСЧР НАПЮГЖС.

function endfile(file) -
if (! no.print && count.only)
if (do.filenames)
print file ":" fcount else
print fcount
total += fcount ""

щРН ОПЮБХКН ОПНХГБНДХР АНКЭЬСЧ ВЮЯРЭ ПЮАНРШ ОН НОПЕДЕКЕМХЪ ЯННРБЕРЯРБХЪ ЯРПНЙ.


of matching lines. The variable matches will be true if the line matched the pattern. If the user wants lines that did not match, the sense of the matches is inverted using the `!' operator. fcount is incremented with the value of matches, which will be either one or zero, depending upon a successful or unsuccessful match. If the line did not match, the next statement just moves on to the next record.


хЛЕЕРЯЪ МЕЯЙНКЭЙН НОРХЛХГЮЖХИ ДКЪ СБЕКХВЕМХЪ ОПНХГБНДХРЕКЭМНЯРХ Б ЯКЕДСЧЫХУ МЕЯЙНКЭЙХУ ЯРПНЙЮУ ЙНДЮ. еЯКХ ОНКЭГНБЮРЕКЧ МСФЕМ РНКЭЙН БШУНДМНИ ЯРЮРСЯ, (no.print ЕЯРЭ true) Х МЕ МСФМН ЯВХРЮРЭ ЯРПНЙХ, РН ДНЯРЮРНВМН ГМЮРЭ, ВРН НДМЮ ЯРПНЙЮ Б ЩРНЛ ТЮИКЕ ЯННРБЕРЯРБСЕР НАПЮГЖС, Х ЛШ ЛНФЕЛ ОЕПЕИРХ Й ЯКЕДСЧЫЕЛС ТЮИКС ОН nextfile. рНВМН РЮЙ ФЕ, ЕЯКХ ЛШ ОЕВЮРЮЕЛ РНКЭЙН ХЛЕМЮ ТЮИКНБ Х МЕ УНРХЛ ЯВХРЮРЭ ЯРПНЙХ, ЛШ ЛНФЕЛ ОЕВЮРЮРЭ ХЛЪ ТЮИКЮ Х ГЮРЕЛ ОЕПЕОПШЦХБЮРЭ Й ЯКЕДСЧЫЕЛС ТЮИКС Я ОНЛНЫЭЧ nextfile.

мЮЙНМЕЖ, ЕЯКХ МЕНАУНДХЛН, ЛНФМН ОЕВЮРЮРЭ ЙЮФДСЧ ЯРПНЙС Я ОПЕДЬЕЯРБСЧЫХЛХ ХЛЕМЕЛ ТЮИКЮ Х ДБНЕРНВХЕЛ.

-
matches = ($0 ~ pattern) if (invert)
matches = ! matches
fcount += matches # 1 or 0
if (! matches)
next
if (no.print && ! count.only)
nextfile
if (filenames.only && ! count.only) -
print FILENAME nextfile ""
if (do.filenames && ! count.only)
print FILENAME ":" $0 else if (! count.only)
print ""

оПЮБХКН END ГЮАНРХРЯЪ Н БШДЮВЕ ОПЮБХКЭМНЦН БШУНДМНЦН ЯРЮРСЯЮ. еЯКХ ЯННРБЕРЯРБХЪ МЕ АШКХ НАМЮПСФЕМШ, НМ ПЮБЕМ 1, Б ОПНРХБМНЛ ЯКСВЮЕ 0.

END " -
if (total == 0)
exit 1 exit 0 ""

тСМЙЖХЪ usage ОЕВЮРЮЕР ЯБНЕ ЯННАЫЕМХЕ Б ЯКСВЮХ НЬХАНЙ Б ОЮПЮЛЕРПЮУ Х ОПЕПШБЮЕР ОПНЦПЮЛЛС.

function usage( e) -
e = "Usage: egrep [-csvil] [-e pat] [files ...]"
print e ? "/dev/stderr" exit 1 ""

оЕПЕЛЕММЮЪ e ХЯОНКЭГСЕРЯЪ, ВРНАШ ОЕВЮРЭ СЙКЮДШБЮКЮЯЭ МЮ ЯРПЮМХЖЕ.

яДЕКЮЕЛ НДМН ГЮЛЕВЮМХЕ Н ЯРХКЕ ОПНЦПЮЛЛХПНБЮМХЪ. бШ ЛНЦКХ ГЮЛЕРХРЭ, ВРН ОПЮБХКН END ХЯОНКЭГСЕР ДКЪ ОПНДНКФЕМХЪ НАПЮРМШИ ЯКЕЬ, Я НДМНИ НРЙПШРНИ ЯЙНАЙНИ МЮ ЯРПНЙЕ. щРН РЮЙ, ОНРНЛС ВРН ЩРН АНКЕЕ РНВМН НРБЕВЮЕР ЯОНЯНАС МЮОХЯЮМХЪ ТСМЙЖХИ. лМНЦХЕ ОПХЛЕПШ Б ЩРНИ ЦКЮБЕ ХЯОНКЭГСЧР ЩРНР ЯРХКЭ. бШ ЛНФЕРЕ ПЕЬХРЭ ДКЪ ЯЕАЪ, МПЮБХРЯЪ КХ БЮЛ ОХЯЮРЭ БЮЬХ ОПЮБХКЮ BEGIN Х END ЩРХЛ ЯОНЯНАНЛ ХКХ МЕР.

16.1.3 оЕВЮРЭ ХМТНПЛЮЖХХ Н ОНКЭГНБЮРЕКЪУ

б МЮВЮКН ЯРПЮМХЖШ

сРХКХРЮ id ОЕПЕВХЯКЪЕР ОНКЭГНБЮРЕКЭЯЙХЕ ПЕЮКЭМШЕ Х ТЮЙРХВЕЯЙХЕ ХДЕМРХТХЙЮЖХНММШЕ МНЛЕПЮ, ПЕЮКЭМШЕ Х ТЮЙРХВЕЯЙХЕ ЦПСООНБШЕ ХДЕМРХТХЙЮЖХНММШЕ МНЛЕПЮ, Х, ЕЯКХ НМХ ХЛЕЧРЯЪ, ЛМНФЕЯРБЮ ОНКЭГНБЮРЕКЭЯЙХУ ЦПСОО. id ОЕВЮРЮЕР ЩТТЕЙРХБМШЕ ОНКЭГНБЮРЕКЭЯЙХЕ Х ЦПСООНБШЕ ХДЕМРХТХЙЮРНПШ РНКЭЙН РНЦДЮ, ЙНЦДЮ НМХ НРКХВЮЧРЯЪ НР ПЕЮКЭМШУ. еЯКХ БНГЛНФМН, id РЮЙФЕ БШДЮЕР ОНКЭГНБЮРЕКЭЯЙХЕ Х ЦПСООНБШЕ ХЛЕМЮ. бШБНД ЛНФЕР БШЦКЪДЕРЭ РЮЙ:

$ id
a uid=2076(arnold) gid=10(staff) groups=10(staff),4(tty)

щРН РЮ ФЕ ЯЮЛЮЪ ХМТНПЛЮЖХЪ, ЙНРНПЮЪ БШДЮЕРЯЪ ЯОЕЖХЮКЭМШЛ ТЮИКНБ gawk `/dev/user' (ЯЛ. ПЮГДЕК 6.7 [яОЕЖХЮКЭМШЕ ХЛЕМЮ ТЮИКНБ Б gawk], ЯРП. 72). нДМЮЙН, СРХКХРЮ id НАЕЯОЕВХБЮЕР АНКЕЕ СДНАМШИ БШБНД, ВЕЛ ОПНЯРН ЖЕОНВЙЮ ВХЯЕК.

оПХБЕДЕЛ ОПНЯРСЧ БЕПЯХЧ id, МЮОХЯЮММСЧ МЮ awk. нМЮ ХЯОНКЭГСЕР АХАКХНРЕВМШЕ ТСМЙЖХХ ОНКЭГНБЮРЕКЭЯЙНИ АЮГШ ДЮММШУ (ЯЛ. ПЮГДЕК 15.11 [вРЕМХЕ ОНКЭГНБЮРЕКЭЯЙНИ АЮГШ ДЮММШУ], ЯРП. 192), Х АХАКХНРЕВМШЕ ТСМЙЖХХ ЦПСООНБНИ АЮГШ ДЮММШУ (ЯЛ. ПЮГДЕК 15.12 [вРЕМХЕ ЦПСООНБНИ АЮГШ ДЮММШУ], ЯРП. 197).

щРЮ ОПНЦПЮЛЛЮ ДНЯРЮРНВМН МЕГЮЛШЯКНБЮРЮ. бЯЪ ПЮАНРЮ ДЕКЮЕРЯЪ Б ОПЮБХКЕ BEGIN. оНКЭГНБЮРЕКЭЯЙХЕ Х ЦПСООНБШЕ ХДЕМРХТХЙЮЖХНММШЕ МНЛЕПЮ ОНКСВЮЧРЯЪ НР `/dev/user'. еЯКХ ТЮИКЮ `/dev/user' МЕР, ОПНЦПЮЛЛЮ МЕ ПЮАНРЮЕР.

б ЙНДЕ ОПНЦПЮЛЛШ ЛМНЦН ОНБРНПЕМХИ. бУНД ОНКЭГНБЮРЕКЭЯЙНИ АЮГШ Я ПЕЮКЭМШЛ ВХЯКНБШЛ ХДЕМРХТХЙЮРНПНЛ ПЮЯЫЕОКЪЕРЯЪ МЮ ВЮЯРХ ОНЯПЕДЯРБНЛ `:'. хЛЪ ЕЯРЭ ОЕПБНЕ ОНКЕ. оНДНАМШИ ФЕ ЙНД ХЯОНКЭГСЕРЯЪ ДКЪ ЩТТЕЙРХБМНЦН ХДЕМРХТХЙЮЖХНММНЦН МНЛЕПЮ ОНКЭГНБЮРЕКЪ Х ДКЪ ЦПСООНБШУ МНЛЕПНБ.

# id.awk --- ПЕЮКХГЮЖХЪ  id Б awk
# Arnold Robbins, arnold@gnu.org, Public Domain # May 1993
# БШУНД РЮЙНБ:
# uid=12(foo) euid=34(bar) gid=3(baz) "
# egid=5(blat) groups=9(nine),2(two),1(one)

BEGIN " -
if ((getline ! "/dev/user") ! 0) -
err = "id: no /dev/user support - cannot run"
print err ? "/dev/stderr" exit 1 "" close("/dev/user")
uid = $1 euid = $2 gid = $3 egid = $4


printf("uid=%d", uid) pw = getpwuid(uid) if (pw != "") -
split(pw, a, ":") printf("(%s)", a[1]) ""
if (euid != uid) -
printf(" euid=%d", euid) pw = getpwuid(euid) if (pw != "") -
split(pw, a, ":") printf("(%s)", a[1]) "" ""
printf(" gid=%d", gid) pw = getgrgid(gid) if (pw != "") -
split(pw, a, ":") printf("(%s)", a[1]) ""
if (egid != gid) -
printf(" egid=%d", egid) pw = getgrgid(egid) if (pw != "") -
split(pw, a, ":") printf("(%s)", a[1]) "" ""
if (NF ? 4) -
printf(" groups="); for (i = 5; i != NF; i++) -
printf("%d", $i) pw = getgrgid($i) if (pw != "") -
split(pw, a, ":") printf("(%s)", a[1]) ""

if (i ! NF)
printf(",") "" "" print "" ""

16.1.4 пЮГДЕКЕМХЕ АНКЭЬНЦН ТЮИКЮ МЮ ВЮЯРХ

б МЮВЮКН ЯРПЮМХЖШ

оПНЦПЮЛЛЮ split ПЮГДЕКЪЕР АНКЭЬХЕ РЕЙЯРНБШЕ ТЮИКШ МЮ ЛЕМЭЬХЕ ВЮЯРХ. оН СЛНКВЮМХЧ, БШУНДМШЕ ТЮИКШ ХЛЕМСЧРЯЪ `xaa', `xab', Х Р. Д. йЮФДШИ ТЮИК ЯНДЕПФХР 1000 ЯРПНЙ, ГЮ ХЯЙКЧВЕМХЕЛ ОНЯКЕДМЕЦН. дКЪ ХГЛЕМЕМХЪ ЙНКХВЕЯРБЮ ЯРПНЙ Б ЙЮФДНЛ ТЮИКЕ МСФМН СЙЮГШБЮРЭ Б ЙНЛЮМДМНИ ЯРПНЙЕ ВХЯКН Я ОПЕДЬЕЯРБСЧЫХЛ ЛХМСЯНЛ, МЮОПХЛЕП `-500' ДКЪ ТЮИКНБ Я 500 ЯРПНЙ БЛЕЯРН 1000. вРНАШ ХГЛЕМХРЭ ХЛЕМЮ БШУНДМШУ ТЮИКНБ МЮ ВРН-МХАСДЭ БПНДЕ `myfileaa', `myfileab', Х Р.Д., МСФМН СЙЮГЮРЭ ДНОНКМХРЕКЭМШИ ЮПЦСЛЕМР Я ХЛЕМЕЛ ТЮИКЮ.

оПХБЕДЕЛ БЕПЯХЧ split Б awk. нМЮ ХЯОНКЭГСЕР ТСМЙЖХХ ord Х chr, ОПЕДЯРЮБКЕММШЕ Б ПЮГДЕКЕ 15.5 [оЕПЕБНД ЯХЛБНКНБ Б ВХЯКЮ Х НАПЮРМН], ЯРП. 174. оПНЦПЮЛЛЮ ЯМЮВЮКЮ СЯРЮМЮБКХБЮЕР ОЮПЮЛЕРПШ ОН СЛНКВЮМХЧ, Ю ГЮРЕЛ ОПНБЕПЪЕР, МЕ ЯКХЬЙНЛ КХ ЛМНЦН ЮПЦСЛЕМРНБ ГЮДЮМН. гЮРЕЛ НМЮ ЯЛНРПХР МЮ ЙЮФДШИ ГЮДЮММШИ ЮПЦСЛЕМР. оЕПБШИ ЮПЦСЛЕМР ЛНФЕР АШРЭ ЛХМСЯНЛ ЯН ЯКЕДСЧЫХЛ ГЮ МХЛ ВХЯКНЛ. еЯКХ РЮЙ, РН НМ БШЦКЪДХР ЙЮЙ НРПХЖЮРЕКЭМНЕ ВХЯКН. щРН ВХЯКН ОПЕБПЮЫЮЕРЯЪ Б ОНКНФХРЕКЭМНЕ Х ЯРЮМНБХРЯЪ ЯВЕРВХЙНЛ ЯРПНЙ. хЛЪ ТЮИКЮ Я ДЮММШЛХ НАУНДХРЯЪ Х ОНЯКЕДМХИ ЮПЦСЛЕМР ХЯОНКЭГСЕРЯЪ ЙЮЙ ОПЕТХЙЯ ДКЪ ХЛЕМ БШУНДМШУ ТЮИКНБ.

# split.awk --- ЛНДЕКХПСЕР split Б awk
# Arnold Robbins, arnold@gnu.org, Public Domain 
# May 1993
# ХЯОНКЭГНБЮМХЕ: split [-num] [file] [outname]
BEGIN -
outfile = "x" 
# default count = 1000 if (ARGC ? 4)
usage()
i = 1 if (ARGV[i] ~ /^-[0-9]+$/) -
ount = -ARGV[i] ARGV[i] = "" i++ ""
# ОПНБЕПЙЮ argv Б ЯКСВЮЕ ВРЕМХЪ ХГ  stdin БЛЕЯРН ТЮИКЮ
if (i in ARGV)
i++ # ОПНОСЯЙ ХЛЕМХ ТЮИКЮ Я ДЮММШЛХ
if (i in ARGV) -
outfile = ARGV[i] ARGV[i] = "" ""
s1 = s2 = "a" out = (outfile s1 s2) ""

яКЕДСЧЫЕЕ ОПЮБХКН ДЕКЮЕР АНКЭЬСЧ ВЮЯРЭ ПЮАНРШ. tcount (БПЕЛЕММШИ ЯВЕРВХЙ) ЯКЕДХР, ЯЙНКЭЙН ЯРПНЙ АШКН МЮОЕВЮРЮМН ДН ЯХУ ОНП Б БШУНДМНЛ ТЮИКЕ. еЯКХ ЩРН АНКЭЬЕ ВЕЛ count, МСФМН ГЮЙПШРЭ РЕЙСЫХИ ТЮИК Х МЮВЮРЭ МНБШИ. s1 and s2 ЯКЕДЪР ГЮ РЕЙСЫХЛХ ЯСТТХЙЯЮЛХ ХЛЕМХ ТЮИКЮ. еЯКХ НМХ НАЕ `z', ТЮИК ЯКХЬЙНЛ БЕКХЙ. б ОПНРХБМНЛ ЯКСВЮЕ s1 ОЕПЕДБХЦЮЕРЯЪ МЮ ЯКЕДСЧЫСЧ АСЙБС ЮКТЮБХРЮ, Ю s2 МЮВХМЮЕРЯЪ НОЪРЭ Я `a'.

if (++tcount ? count) -
close(out) if (s2 == "z") -
if (s1 == "z") -
printf("split: %s is too large to split"n", "
FILENAME) ? "/dev/stderr" exit 1 "" s1 = chr(ord(s1) + 1) s2 = "a" "" else
s2 = chr(ord(s2) + 1) out = (outfile s1 s2) tcount = 1 "" print ? out ""
The usage function simply prints an error message and exits.
function usage( e) -
e = "usage: split [-num] [file] [outname]" print e ? "/dev/stderr" exit 1 ""

хЯОНКЭГСЕРЯЪ ОЕПЕЛЕММЮЪ e, РЮЙ ВРН ПЕГСКЭРЮР УНПНЬН ПЮГЛЕЫЮЕРЯЪ МЮ ЯРПЮМХЖЕ. щРЮ ОПНЦПЮЛЛЮ МЕЯЙНКЭЙН МЕАПЕФМЮ; НМЮ МЮДЕЕРЯЪ, ВРН awk ЮБРНЛЮРХВЕЯЙХ ГЮЙПНЕР ОНЯКЕДМХИ ТЮИК, БЛЕЯРН РНЦН, ВРНАШ ЯДЕКЮРЭ ЩРН ЯЮЛНИ Б ОПЮБХКЕ END.

16.1.5 пЮГЛМНФЕМХЕ БШБНДЮ Б МЕЯЙНКЭЙН ТЮИКНБ

б МЮВЮКН ЯРПЮМХЖШ

оПНЦПЮЛЛЮ tee ХГБЕЯРМЮ ЙЮЙ "ОНДЦНМЙЮ Й ЙНМБЕИЕПС". tee ЙНОХПСЕР ЯБНИ ЯРЮМДЮПРМШИ ББНД Б ЯБНИ ЯРЮМДЮПРМШИ БШУНД Х РЮЙФЕ ДСОКХЖХПСЕР ЕЦН Б ТЮИКШ, МЮГБЮММШЕ Б ЙНЛЮМДМНИ ЯРПНЙЕ. нМЮ ХЯОНКЭГСЕРЯЪ РЮЙ:

tee [-a] file ... оЮПЮЛЕРП `-a' ОНАСФДЮЕР ОХЯЮРЭ Б ЙНМЕЖ МЮГБЮММШУ ТЮИКНБ, БЛЕЯРН РНЦН, ВРНАШ ГЮЙПШБЮРЭ ХУ ГЮОСЯЙЮРЭЯЪ БМНБЭ.

оПЮБХКН BEGIN ЯМЮВЮКЮ ДЕКЮЕР ЙНОХЧ БЯЕУ ЮПЦСЛЕМРНБ ЙНЛЮМДМНИ ЯРПНЙХ Б ЛЮЯЯХБ Я ХЛЕМЕЛ copy. ARGV[0] МЕ ЙНОХПСЕРЯЪ, РЮЙ ЙЮЙ МЕ МСФЕМ. tee МЕ ЛНФЕР ХЯОНКЭГНБЮРЭ ARGV МЕОНЯПЕДЯРБЕММН, ОНЯЙНКЭЙС awk АСДЕР ОШРЮРЭЯЪ НАПЮАЮРШБЮРЭ ЙЮФДШИ ТЮИК, МЮГБЮММШИ Б ARGV, ЙЮЙ БУНДМШЕ ДЮММШЕ.

еЯКХ ОЕПБШИ ЮПЦСЛЕМР ЕЯРЭ `-a', РН ТКЮФНЙ append ЯРЮБХРЯЪ Б true Х НАЕ ARGV[1] Х copy[1] БШВЕПЙХБЮЧРЯЪ. еЯКХ ARGC ЛЕМЭЬЕ ДБСУ, РН МХЙЮЙХЕ ТЮИКШ МЕ АШКХ МЮГБЮМШ, Х tee ОЕВЮРЮЕР ЯННАЫЕМХЕ usage Х ЙНМВЮЕР ПЮАНРС. б ЙНМЖЕ awk ОНАСФДЮЕРЯЪ Й ВРЕМХЧ ЯРЮМДЮПРМНЦН ББНДЮ СЯРЮМНБЙНИ Б ARGV[1] ГМЮВЕМХЪ "-", Х ДБНИЙХ Б ARGC.

# tee.awk --- tee Б awk
# Arnold Robbins, arnold@gnu.org, Public Domain 
# May 1993
# Revised December 1995
BEGIN " -
for (i = 1; i ! ARGC; i++)
copy[i] = ARGV[i]
if (ARGV[1] == "-a") -
append = 1 delete ARGV[1] delete copy[1] ARGC-- "" if (ARGC ! 2) -
print "usage: tee [-a] file ..." ? "/dev/stderr" exit 1 ""
ARGV[1] = "-" ARGC = 2 ""

нДМН ОПЮБХКН БШОНКМЪЕР БЯЧ ПЮАНРС. рЮЙ ЙЮЙ НАПЮГЖЮ МЕР, НМН БШОНКМЪЕРЯЪ ДКЪ ЙЮФДНИ БУНДМНИ ЯРПНЙХ. рЕКН ОПЮБХКЮ ОПНЯРН ОЕВЮРЮЕР ЯРПНЙС Б ЙЮФДНЛ ТЮИКЕ, МЮГБЮММНЛ Б ЙНЛЮМДМНИ ЯРПНЙЕ, Х ГЮРЕЛ Б ЯРЮМДЮПРМНЛ БШУНДЕ.

-
# БШМЕЯЕМХЕ if ХГ ЖХЙКЮ СЯЙНПЪЕР ЕЦН ПЮАНРС
if (append)
for (i in copy)
print ?? copy[i] else
for (i in copy)
print ? copy[i] print ""

лНФМН АШКН АШ ЙНДХПНБЮРЭ ЖХЙК РЮЙ:

for (i in copy)
if (append)
print ?? copy[i] else
print ? copy[i]

щРН ЙНПНВЕ, МН ЛЕМЕЕ ЩТТЕЙРХБМН. `if' ОПНБЕПЪЕРЯЪ ДКЪ ЙЮФДНИ ГЮОХЯХ Х ДКЪ ЙЮФДНЦН БШУНДМНЦН ТЮИКЮ. оПХ ОНБРНПЕМХХ РЕКЮ ЖХЙКЮ `if' ОПНБЕПЪЕРЯЪ РНКЭЙН ПЮГ ДКЪ ЙЮФДНИ БУНДМНИ ГЮОХЯХ. еЯКХ ХЛЕЧРЯЪ N БУНДМШУ ГЮОХЯЕИ Х M БУНДМШУ ТЮИКНБ, ОЕПБШИ ЛЕРНД БШОНКМЪЕР РНКЭЙН N НОЕПЮРНПНБ `if', Б РН БПЕЛЪ ЙЮЙ БРНПНИ АСДЕР БШОНКМЪРЭ N *M НОЕПЮРНПНБ `if'

б ЙНМЖЕ ПЮАНРШ ОПЮБХКН END ГЮЙПШБЮЕР БЯЕ БШУНДМШЕ ТЮИКШ.
END " -
for (i in copy)
close(copy[i]) ""

16.1.6 оЕВЮРЭ, МЕ ДСОКХЖХПНБЮММШУ ЯРПНЙ РЕЙЯРЮ

б МЮВЮКН ЯРПЮМХЖШ

сРХКХРЮ uniq ВХРЮЕР НРЯНПРХПНБЮММШЕ ЯРПНЙХ РЕЙЯРЮ ДЮММШУ ХГ ЯРЮМДЮПРМНЦН ББНДЮ Х (ОН СЛНКВЮМХЧ) СДЮКЪЕР ДСАКХПНБЮММШЕ ЯРПНЙХ. дПСЦХЛХ ЯКНБЮЛХ, ОЕВЮРЮЧРЯЪ РНКЭЙН СМХЙЮКЭМШЕ ЯРПНЙХ. нРЯЧДЮ Х ХЛЪ СРХКХРШ. uniq ХЛЕЕР МЕЯЙНКЭЙН ОЮПЮЛЕРПНБ. нМЮ БШГШБЮЕРЯЪ РЮЙ:

uniq [-udc [-n]] [+n] [ input file [ output file ]]
оЮПЮЛЕРПШ ХЛЕЧР ЯКЕДСЧЫХИ ЯЛШЯК:

-d   оЕВЮРЭ РНКЭЙН ОНБРНПЕММШУ ЯРПНЙ.
-u   оЕВЮРЭ РНКЭЙН МЕОНБРНПЪЧЫХУЯЪ ЯРПНЙ.
-c   яВХРЮРЭ ЯРПНЙХ. щРНР ОЮПЮЛЕРП ОНДЮБКЪЕР `-d' Х `-u'. 
	 яВХРЮЧРЯЪ ЙЮЙ ОНБРНПЪЧЫХЕЯЪ, РЮЙ 
	 Х МЕОНБРНПЪЧЫХЕЯЪ ЯРПНЙХ.

-n   оПНОСЯРХРЭ  n ОНКЕИ ОЕПЕД ЯПЮБМЕМХЕЛ ЯРПНЙ. 
	нОПЕДЕКЕМХЕ ОНКЕИ  ОН
	ОПЮБХКС СЛНКВЮМХЪ Б awk: МЕ-whitespace ЯХЛБНКШ, 
	НРДЕКЕММШЕ ЦПСООЮЛХ
	ОПНАЕКНБ Х/ХКХ tab.

+n   оПНОСЯРХРЭ n ЯХЛБНКНБ ОЕПЕД ЯПЮБМЕМХЕЛ ЯРПНЙ. 
	оПЕДБЮПХРЕКЭМН ОПНОСЯЙЮЧРЯЪ
	ОНКЪ, СЙЮГЮММШЕ ОЮПЮЛЕРПНЛ `-n'.

input file  бУНДМШЕ ДЮММШЕ ВХРЮЧРЯЪ ХГ БУНДМНЦН ТЮИКЮ, 
	МЮГБЮММНЦН Б ЙНЛЮМДМНИ
	ЯРПНЙЕ, Ю МЕ ХГ ЯРЮМДЮПРМНЦН ББНДЮ.


output file  цЕМЕПХПНБЮММШИ БШБНД МЮОПЮБКЪЕРЯЪ 
	Б МЮГБЮММШИ БШУНДМНИ ТЮИК,
	Ю МЕ Б ЯРЮМДЮПРМШИ БШБНД.

мНПЛЮКЭМН uniq ПЮАНРЮЕР РЮЙ, ЙЮЙ АСДРН ОПХЯСРЯРБСЧР НАЮ ОЮПЮЛЕРПЮ `-d' Х `-u'.

оПХБЕДЕЛ awk-ПЕЮКХГЮЖХЧ uniq. нМЮ ХЯОНКЭГСЕР АХАКХНРЕВМСЧ ТСМЙЖХЧ getopt (ЯЛ. ПЮГДЕК 15.10 [нАПЮАНРЙЮ ОЮПЮЛЕРПНБ ЙНЛЮМДМНИ ЯРПНЙХ, ЯРП. 186), Х АХАКХНРЕВМСЧ ТСМЙЖХЧ join (ЯЛ. ПЮГДЕК 15.6 [яНЕДХМЕМХЕ ЩКЕЛЕМРНБ ЛЮЯЯХБЮ Б ЖЕОНВЙС], ЯРП. 176).

оПНЦПЮЛЛЮ МЮВХМЮЕРЯЪ Я ТСМЙЖХХ usage, ГЮРЕЛ ЯКЕДСЕР ЙПЮРЙХИ НАГНП ОЮПЮЛЕРПНБ Х ЙНЛЛЕМРЮПХИ НА ХУ МЮГМЮВЕМХХ.

оПЮБХКН BEGIN ПЮАНРЮЕР Я ЮПЦСЛЕМРЮЛХ ЙНЛЮМДМНИ ЯРПНЙХ Х ОЮПЮЛЕРПЮЛХ. нМН ХЯОНКЭГСЕР СКНБЙС, ВРНАШ ГЮЯРЮБХРЭ getopt ДЕИЯРБНБЮРЭ Я ОЮПЮЛЕРПЮЛХ ТНПЛШ `-25', ПЮЯЯЛЮРПХБЮЪ РЮЙНИ ОЮПЮЛЕРП ЙЮЙ ОЮПЮЛЕРП-АСЙБС `2' Я ЮПЦСЛЕМРНЛ `5'. еЯКХ ДЕИЯРБХРЕКЭМН АШКХ СЙЮГЮМШ ДБЕ ХКХ АНКЕЕ ЖХТП (Optarg БШЦКЪДХР ЙЮЙ ВХЯКН), Optarg ЯЖЕОКЪЕРЯЪ Я ЖХТПНИ ОЮПЮЛЕРПЮ Х ГЮРЕЛ ПЕГСКЭРЮР ЯЙКЮДШБЮЕРЯЪ Я МСКЕЛ ДКЪ ОПЕБПЮЫЕМХЪ ЕЦН Б ВХЯКН. еЯКХ ХЛЕЕРЯЪ РНКЭЙН НДМЮ ЖХТПЮ Б ОЮПЮЛЕРПЕ, РН Optarg МЕ МСФЕМ Х Optind ДНКФЕМ АШРЭ СЛЕМЭЬЕМ РЮЙ, ВРН getopt АСДЕР НАПЮАЮРШБЮРЭ ЕЦН Б ЯКЕДСЧЫХИ ПЮГ. рЮЙ ВРН ЩРНР ЙНД Б МЕЙНРНПНИ ЯРЕОЕМХ МЕНАШВМШИ.

еЯКХ ОЮПЮЛЕРПНБ МЕР, ОН СЛНКВЮМХЧ ОЕВЮРЮЧРЯЪ Х ОНБРНПЕММШЕ Х МЕ ОНБРНПЕММШЕ ЯРПНЙХ. бШУНДМНИ ТЮИК, ЕЯКХ СЙЮГЮМ, ОПХЯБЮХБЮЕРЯЪ Б outputfile. пЮМЕЕ outputfile ХМХЖХЮКХГХПНБЮКЯЪ ЙЮЙ ЯРЮМДЮПРМШИ БШБНД , `/dev/stdout'.

# uniq.awk --- ЛНДЕКЭ uniq Б awk
# Arnold Robbins, arnold@gnu.org, Public Domain 
# May 1993
function usage( e) -
e = "Usage: uniq [-udc [-n]] [+n] [ in [ out ]]"
print e ? "/dev/stderr" exit 1 ""
# -c ЯВЕР ЯРПНЙ. ОНДЮБКЪЕР -d Х -u 
# -d РНКЭЙН ОНБРНПМШЕ ЯРПНЙХ
# -u РНКЭЙН МЕ ОНБРНПЪЧЫХЕЯЪ ЯРПНЙХ
# -n ОПНОСЯРХРЭ n ОНКЕИ
# +n ОПНОСЯРХРЭ  n ЯХЛБНКНБ, МН ЯМЮВЮКЮ ОПНОСЯЙЮРЭ ОНКЪ
BEGIN " -
count = 1 outputfile = "/dev/stdout" opts = "udc0:1:2:3:4:5:6:7:8:9:"
while ((c = getopt(ARGC, ARGV, opts)) != -1) -
if (c == "u")
non.repeated.only++ else if (c == "d")
repeated.only++ else if (c == "c")
do.count++ else if (index("0123456789", c) != 0) -
# getopt РПЕАСЕР ЮПЦСЛЕМРШ Й ОЮПЮЛЕРПЮЛ
# ЩРН ГЮОСРШБЮЕР МЮЯ Я ЮПЦСЛЕМРЮЛХ БПНДЕ -5
if (Optarg ~ /^[0-9]+$/)
fcount = (c Optarg) + 0 else -
fcount = c + 0 Optind-- "" "" else
usage() ""
if (ARGV[Optind] ~ /^"+[0-9]+$/) -
charcount = substr(ARGV[Optind], 2) + 0 Optind++ ""
for (i = 1; i ! Optind; i++)
ARGV[i] = ""
if (repeated.only == 0 && non.repeated.only == 0)
repeated.only = non.repeated.only = 1
if (ARGC - Optind == 2) -
outputfile = ARGV[ARGC - 1] ARGV[ARGC - 1] = "" "" ""

яКЕДСЧЫЮЪ ТСМЙЖХЪ, are.equal, ЯПЮБМХБЮЕР РЕЙСЫСЧ ЯРПНЙС, $0, Я ОПЕДШДСЫЕИ ЯРПНЙНИ, last. нМЮ ПЕЮКХГСЕР ОПНОСЯЙ ОНКЕИ Х ЯХЛБНКНБ. еЯКХ МЕ АШКХ ГЮЙЮГЮМШ МХ ЯВЕР ОНКЕИ МХ ЯВЕР ЯХЛБНКНБ, РН are.equal ОПНЯРН БНГБПЮЫЮЕР 1 ХКХ 0 Б ГЮБХЯХЛНЯРХ НР ПЕГСКЭРЮРЮ ОПНЯРНЦН ЯПЮБМЕМХЪ last Х $0. б ОПНРХБМНЛ ЯКСВЮЕ ДЕИЯРБХЪ СЯКНФМЪЧРЯЪ. еЯКХ ДНКФМШ АШРЭ ОПНОСЫЕМШ ОНКЪ, ЙЮФДЮЪ ЯРПНЙЮ ОПЕБПЮЫЮЕРЯЪ Б ЛЮЯЯХБ Я ОНЛНЫЭЧ split (ЯЛ. ПЮГДЕК 12.3 [бЯРПНЕММШЕ ТСМЙЖХХ ДКЪ ДЕИЯРБХИ Я ЖЕОНВЙЮЛХ], ЯРП. 137), Х ГЮРЕЛ МСФМШЕ ОНКЪ НОЪРЭ ЯНЕДХМЪЧРЯЪ Б ЯРПНЙС Я ОНЛНЫЭЧ join. оНКСВЕММШЕ ЯРПНЙХ ОНЯРСОЮЧР Б clast Х cline. еЯКХ МХЙЮЙХЕ ОНКЪ МЕ ОПНОСЯЙЮЧРЯЪ, Б clast Х cline СЯРЮМЮБКХБЮЧРЯЪ last Х $0 ЯННРБЕРЯРБЕММН. мЮЙНМЕЖ, ЕЯКХ ОПНОСЯЙЮЧРЯЪ ЯХЛБНКШ, ХЯОНКЭГСЕРЯЪ substr ДКЪ СДЮКЕМХЪ БЕДСЫХУ charcount ЯХЛБНКНБ Б clast Х cline. гЮРЕЛ ДБЕ ЖЕОНВЙХ ЯПЮБМХБЮЧРЯЪ Х are.equal БНГБПЮЫЮЕР ПЕГСКЭРЮР ЯПЮБМЕМХЪ.

function are.equal( n, m, clast, cline, alast, aline) -
if (fcount == 0 && charcount == 0)
return (last == $0)
if (fcount ? 0) -
n = split(last, alast) m = split($0, aline) clast = join(alast, fcount+1, n)
cline = join(aline, fcount+1, m) "" else -
clast = last cline = $0 "" if (charcount) -
clast = substr(clast, charcount + 1) cline = substr(cline, charcount + 1) ""
return (clast == cline) ""

дБЮ ЯКЕДСЧЫХЕ ОПЮБХКЮ ЯНЯРЮБКЪЧР РЕКН ОПНЦПЮЛЛШ. оЕПБНЕ БШОНКМЪЕРЯЪ РНКЭЙН ДКЪ ЯЮЛНИ ОЕПБНИ ЯРПНЙХ ДЮММШУ. нМН СЯРЮМЮБКХБЮЕР last ПЮБМШЛ $0, ДКЪ ЯПЮБМЕМХЪ Я ОНЯКЕДСЧЫХЛХ ЯРПНЙЮЛХ РЕЙЯРЮ.

бРНПНЕ ОПЮБХКН БШОНКМЪЕР БЯЧ ПЮАНРС. оЕПЕЛЕММЮЪ equal АСДЕР 1 ХКХ 0 Б ГЮБХЯХЛНЯРХ НР ПЕГСКЭРЮРНБ ЯПЮБМЕМХЪ, БШДЮБЮЕЛШУ ТСМЙЖХЕИ are.equal. еЯКХ uniq СВХРШБЮЕР ОНБРНПЪЧЫХЕЯЪ ЯРПНЙХ, РН ОЕПЕЛЕММЮЪ count СБЕКХВХБЮЕРЯЪ ОПХ ПЮБЕМЯРБЕ ЯРПНЙ. б ОПНРХБМНЛ ЯКСВЮЕ ЯРПНЙЮ ОЕВЮРЮЕРЯЪ Х count ЯАПЮЯШБЮЕРЯЪ, ОНЯЙНКЭЙС ДБЕ ЯРПНЙХ МЕ ПЮБМШ.

еЯКХ uniq МЕ ОНДЯВХРШБЮЕР, count СБЕКХВХБЮЕРЯЪ, ЕЯКХ ЯРПНЙХ ПЮБМШ. хМЮВЕ, ЕЯКХ uniq ОНДЯВХРШБЮЕР ОНБРНПМШЕ ЯРПНЙХ Х АНКЕЕ ВЕЛ НДМЮ ЯРПНЙЮ АШКЮ ГЮЛЕВЕМЮ, ХКХ ЕЯКХ uniq ЯВХРЮЕР МЕОНБРНПЪЧЫХЕЯЪ ЯРПНЙХ Х РНКЭЙН НДМЮ ЯРПНЙЮ ХЛЕЕРЯЪ, РН ЯРПНЙЮ ОЕВЮРЮЕРЯЪ Х count ЯАПЮЯШБЮЕРЯЪ.

мЮЙНМЕЖ, ОНДНАМЮЪ ФЕ КНЦХЙЮ ХЯОНКЭГСЕРЯЪ Б ОПЮБХКЕ END ДКЪ ОЕВЮРХ ОНЯКЕДМЕИ ЯРПНЙХ Б БУНДМШУ ДЮММШУ.

NR == 1 -
last = $0 next ""
-
equal = are.equal()
if (do.count) - # overrides -d and -u
if (equal)
count++ else -
printf("%4d %s"n", count, last) ? outputfile
last = $0 count = 1 # reset "" next ""
if (equal)
count++ else -
if ((repeated.only && count ? 1) ----
(non.repeated.only && count == 1))
print last ? outputfile last = $0 count = 1 "" ""
END -
if (do.count)
printf("%4d %s"n", count, last) ? outputfile else
if ((repeated.only && count ? 1) ----
(non.repeated.only && count == 1)) print last ? outputfile ""

16.1.7 оНДЯВЕР НАЗЕЙРНБ

б МЮВЮКН ЯРПЮМХЖШ

сРХКХРЮ wc (word count) ОНДЯВХРШБЮЕР ЙНКХВЕЯРБЮ ЯРПНЙ, ЯКНБ Х ЯХЛБНКНБ Б НДМНЛ ХКХ АНКЕЕ БУНДМШУ ТЮИКНБ. нМЮ ХЯОНКЭГСЕРЯЪ РЮЙ:

wc [-lwc] [ files ... ]

еЯКХ Б ЙНЛЮМДМНИ ЯРПНЙЕ ТЮИКШ МЕ СЙЮГЮМШ, wc ВХРЮЕР ЯБНИ ЯРЮМДЮПРМШИ ББНД. еЯКХ СЙЮГЮМН МЕЯЙНКЭЙН ТЮИКНБ, АСДСР МЮОЕВЮРЮМШ ЯСЛЛЮПМШЕ ЯВЕРВХЙХ ДКЪ БЯЕУ ТЮИКНБ. оЮПЮЛЕРПШ Х ХУ ЯЛШЯК ЯКЕДСЧЫХЕ:

-l    рНКЭЙН ОНДЯВЕР ЯРПНЙ

-w    рНКЭЙН ОНДЯВЕР ЯКНБ.  "ЯКНБЮ" ЕЯРЭ 
	  ЯБЪГМШЕ ОНЯКЕДНБЮРЕКЭМНЯРХ ЯХЛБНКНБ,
	  МЕ ЯНДЕПФЮЫЮЪ ЯХЛБНКНБ whitespace, ПЮГДЕКЕММШЕ 
	  ОПНАЕКЮЛХ Х/ХКХ ЯХЛБНКЮЛХ tab.
	  й ЯВЮЯРЭЧ, ЩРН МНПЛЮКЭМШИ ЯОНЯНА ДКЪ awk ПЮГДЕКЕМХЪ
	  ОНКЕИ Б БУНДМШУ ДЮММШУ.
	  
-c    рНКЭЙН ОНДЯВЕР ЯХЛБНКНБ.

пЕЮКХГЮЖХЪ wc ЯПЕДЯРБЮЛХ awk НЯНАЕММН ЩКЕЦЮМРМЮ, ОНЯЙНКЭЙС awk ЯЮЛЮ ДЕКЮЕР АНКЭЬСЧ ВЮЯРЭ ПЮАНРШ; НМЮ ПЮГДЕКЪЕР ЯРПНЙХ МЮ ЯКНБЮ (Р.Е. ОНКЪ) Х ЯВХРЮЕР ХУ, ОНДЯВХРШБЮЕР ЯРПНЙХ( Р.Е. ГЮОХЯХ) Х ЛНФЕР КЕЦЙН ЯННАЫЮРЭ МЮЛ ДКХМС ЯРПНЙ. щРЮ БЕПЯХЪ ХЯОНКЭГСЕР АХАКХНРЕВМСЧ ТСМЙЖХЧ getopt (ЯЛ. ПЮГДЕК 15.10 [нАПЮАНРЙЮ ОЮПЮЛЕРПНБ ЙНЛЮМДМНИ ЯРПНЙХ], ЯРП. 186), Х ТСМЙЖХХ ОЕПЕЙКЧВЕМХЪ ТЮИКНБ (ЯЛ. ПЮГДЕК 15.9 [яКЕФЕМХЕ ГЮ ЦПЮМХЖЮЛХ ТЮИКНБ Я ДЮММШЛХ], ЯРП. 185). щРЮ БЕПЯХЪ ХЛЕЕР НДМН БЮФМНЕ НРКХВХЕ НР РПЮДХЖХНММШУ БЕПЯХИ wc. мЮЬЮ БЕПЯХЪ ОНЯРНЪММН ОЕВЮРЮЕР ЯВЕРВХЙХ Б ОНПЪДЙЕ: ЯРПНЙХ, ЯКНБЮ, ЯХЛБНКШ. рПЮДХЖХНММШЕ БЕПЯХХ ГЮОНЛХМЮЧР ОНПЪДНЙ ОЮПЮЛЕРПНБ `-l', `-w' Х `-c' Б ЙНЛЮМДМНИ ЯРПНЙЕ Х ОЕВЮРЮЧР ЯВЕРВХЙХ Б ЩРНЛ ОНПЪДЙЕ.

оПЮБХКН BEGIN НАПЮАЮРШБЮЕР ЮПЦСЛЕМРШ. оЕПЕЛЕММЮЪ print.total АСДЕР true, ЕЯКХ Б ЙНЛЮМДМНИ ЯРПНЙЕ СЙЮГЮМН АНКЕЕ НДМНЦН ТЮИКЮ.

# wc.awk --- ЯВЕР ЯРПНЙ, ЯКНБ, ЯХЛБНКНБ
# Arnold Robbins, arnold@gnu.org, Public Domain # May 1993
# оЮПЮЛЕРПШ: 
# -l ЯВЕР РНКЭЙН ЯРПНЙ
# -w ЯВЕР РНКЭЙН ЯКНБ 
# -c ЯВЕР РНКЭЙН ЯХЛБНКНБ
# #оН СЛНКВЮМХЧ ОНДЯВЕР ЯРПНЙ, ЯКНБ Х ЯХЛБНКНБ
BEGIN -
# оНАСФДЮЕЛ  getopt ОЕВЮРЮРЭ ЯННАЫЕМХЕ
# Н МЕБЕПМШУ ОЮПЮЛЕРПНБ. лШ ХЦМНПХПСЕЛ ХУ ЕЯКХ
((c = getopt(ARGC, ARGV, "lwc")) != -1) -
if (c == "l")
do.lines = 1 else if (c == "w")
do.words = 1 else if (c == "c")
do.chars = 1 "" for (i = 1; i ! Optind; i++)
ARGV[i] = ""
# ЕЯКХ ОЮПЮЛЕРПНБ МЕР, ДЕКЮРЭ БЯЕ
if (! do.lines && ! do.words && ! do.chars)
do.lines = do.words = do.chars = 1
print.total = (ARGC - i ? 2) ""

тСМЙЖХЪ beginfile ОПНЯРЮ; НМЮ ОПНЯРН ЯАПЮЯШБЮЕР ЯВЕРВХЙХ ЯРПНЙ, ЯКНБ Х ЯХЛБНКНБ МЮ 0 Х ГЮОНЛХМЮЕР ХЛЪ РЕЙСЫЕЦН ТЮИКЮ Б fname. тСМЙЖХЪ endfile ДНАЮБКЪЕР ГМЮВЕМХЪ РЕЙСЫЕЦН ТЮИКЮ Й ЯННРБЕРЯРБСЧЫХЛ ЯСЛЛЮЛ ДКЪ ЯРПНЙ, ЯКНБ Х ЯХЛБНКНБ. гЮРЕЛ ОЕВЮРЮЕР ЩРХ ДЮММШЕ ДКЪ ТЮИКЮ, ЙНРНПШИ АШК РНКЭЙН ВРН ОПНВРЕМ. нМЮ НЯРЮБКЪЕР ДКЪ beginfile ЯАПНЯ ЯВЕРВХЙНБ ДКЪ ЯКЕДСЧЫЕЦН ТЮИКЮ Я ДЮММШЛХ.

function beginfile(file) -
chars = lines = words = 0 fname = FILENAME ""
function endfile(file) -
tchars += chars tlines += lines twords += words if (do.lines)
printf ""t%d", lines
if (do.words)
printf ""t%d", words if (do.chars)
printf ""t%d", chars printf ""t%s"n", fname ""

хЛЕЕРЯЪ НДМН ОПЮБХКН, ЙНРНПНЕ БШОНКМЪЕРЯЪ ДКЪ ЙЮФДНИ ЯРПНЙХ. нМН ДНАЮБКЪЕР ДКХМС ЯРПНЙХ Й ОЕПЕЛЕММНИ chars. нМН ДНКФМН ДНАЮБКЪРЭ 1, ОНЯЙНКЭЙС ЯХЛБНК newline, ПЮГДЕКЪЧЫХИ ГЮОХЯХ (ГМЮВЕМХЕ RS), МЕ БУНДХР Б ЯНЯРЮБ ЯРПНЙХ. оЕПЕЛЕММЮЪ lines СБЕКХВХБЮЕРЯЪ ДКЪ ЙЮФДНИ ОПНВРЕММНИ ГЮОХЯХ, Ю words СБЕКХВХБЮЕРЯЪ МЮ ГМЮВЕМХЕ NF, ЙНКХВЕЯРБН "ЯКНБ" Б ЩРНИ ЯРПНЙЕ.*1*

мЮЙНМЕЖ, ОПЮБХКН END ОПНЯРН ОЕВЮРЮЕР ЯСЛЛШ ОН БЯЕЛ ТЮИКЮЛ.
# ДЕКЮРЭ ДКЪ ЙЮФДНИ ЯРПНЙХ
-
chars += length($0) + 1 # get newline lines++ words += NF ""
END -
if (print.total) -
if (do.lines)
printf ""t%d", tlines if (do.words)
printf ""t%d", twords if (do.chars)
printf ""t%d", tchars print ""ttotal" "" ""
б МЮВЮКН ЯРПЮМХЖШ

<<< нЦКЮБКЕМХЕ яРПЮМХЖШ: 16  17 >>>
цКЮБМЮЪ мНБНЯРХ пЕЦХЯРПЮЖХЪ Б ЙКЮЯЯЕ оПНЦПЮЛЛМНЕ НАЕЯОЕВЕМХЕ оЮПЮККЕКЭМШЕ БШВХЯКЕМХЪ дНЙСЛЕМРЮЖХЪ FAQ ОН ЙКЮЯЯС

HIVE: All information for read only. Please respect copyright!
Hosted by hive йца: йХЕБЯЙЮЪ ЦНПНДЯЙЮЪ АХАКХНРЕЙЮ