Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX β€” ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π°Ρ срСда программирования». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 54

Автор ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½ Π‘Ρ€Π°ΠΉΠ°Π½ Уилсон

Π’Π°Π±Π»ΠΈΡ†Π° 4.5: ВстроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

awk

АссоциативныС массивы

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… являСтся ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ суммарных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ для мноТСства ΠΏΠ°Ρ€ имя Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π˜Π½Ρ‹ΠΌΠΈ словами, ΠΏΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ Ρ‚ΠΈΠΏΠ°

Susie 400

JohnΒ  100

MaryΒ  200

MaryΒ  300

JohnΒ  100

Susie 100

MaryΒ  100

ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ суммарныС значСния для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ:

JohnΒ  200

MaryΒ  600

Susie 500

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°

awk
ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ изящноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ этой Π·Π°Π΄Π°Ρ‡ΠΈ β€” с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ассоциативных массивов. Π₯отя ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΌΡ‹ прСдставляСм сСбС индСкс массива ΠΊΠ°ΠΊ Ρ†Π΅Π»ΠΎΠ΅ число, Π²
awk
любоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС индСкса. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ

Β Β Β  {sum[$1] += $2}

END {for (name in sum) print name sum [name]}

Π·Π°Π΄Π°Π΅Ρ‚ всю ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ подсчСта n ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ сумм для ΠΏΠ°Ρ€ имя Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ нСзависимо ΠΎΡ‚ порядка слСдования этих ΠΏΠ°Ρ€. КаТдоС имя (

$1
) слуТит индСксом Π² массивС
sum
; Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π° ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ Ρ„ΠΎΡ€ΠΌΠ° Ρ†ΠΈΠΊΠ»Π°
for
для ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° всСх элСмСнтов
sum
ΠΈ ΠΈΡ… ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ. Бинтаксис этого Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Ρ†ΠΈΠΊΠ»Π°
for
Ρ‚Π°ΠΊΠΎΠ²:

for (ΠΏΠ΅Ρ€Π΅ΠΌ in массив)

Β ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€

Π₯отя ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π²Π°ΠΌ искусствСнным, ΠΊΠ°ΠΊ Ρ†ΠΈΠΊΠ»

for
языка
shell
, ΠΎΠ½ΠΈ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ связаны. Π¦ΠΈΠΊΠ» ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ индСксы массива, Π° Π½Π΅ Π΅Π³ΠΎ элСмСнты, устанавливая Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ "ΠΏΠ΅Ρ€Π΅ΠΌ" Ρ€Π°Π²Π½Ρ‹ΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ индСксу ΠΏΠΎΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎ. Однако порядок появлСния индСксов нСпрСдсказуСм, поэтому ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² ΠΈΡ… сортировкС. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρƒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Π΅
sort
, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Π½Π° шли Π² порядкС убывания Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ:

$ awk '...' | sort +1nr

РСализация ассоциативной памяти ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ доступ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ элСмСнту Π·Π°Π½ΠΈΠΌΠ°Π» ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΆΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, сколько ΠΈ ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ, ΠΈ Ρ‡Ρ‚ΠΎΠ±Ρ‹ это врСмя Π½Π΅ зависСло (ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ для массивов срСдних Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ²) ΠΎΡ‚ числа элСмСнтов Π² массивС.

ИспользованиС ассоциативных массивов эффСктивно для Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡, Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ подсчСт частоты появлСния слов Π²ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅:

$ cat wordfreq

awk ' { for (i = 1; i <= NF; i++) num[$i]++ }

ENDΒ Β  {for (word in num) print word, num[word] }

' $*

$ wordfreq ch4.* | sort +1 -nr | sed 20q | 4

the 372 .CW 345 ofΒ  220 isΒ Β  185

toΒ  175 aΒ Β  167 inΒ  109 andΒ  100

.PIΒ  94 .P2Β  94 .PPΒ  90 $Β Β Β Β  87

awkΒ  87 sedΒ  83 that 76 forΒ Β  75

TheΒ  63 areΒ  61 line 55 print 52

$

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅

for
выбираСтся ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ слово ΠΈΠ· Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ строки ΠΈ заполняСтся массив
num
, индСксируСмый словами. (НС ΠΏΡƒΡ‚Π°ΠΉΡ‚Π΅
$i
, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰Π΅Π΅ Π²
awk
i-Π΅ ΠΏΠΎΠ»Π΅ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ строки, с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ языка
shell
.) ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Ρ„Π°ΠΉΠ» Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½, Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅
for
ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΡŽΡ‚ΡΡ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΌ порядкС слова ΠΈ частота ΠΈΡ… появлСния.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 4.9

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ дСйствия ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

wordfreq
ΠΏΠΎΠΏΠ°Π»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ форматирования Ρ‚ΠΈΠΏΠ°
.CW
, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ для ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ слов ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠΌ. Как ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ Ρ‚Π°ΠΊΠΈΡ… нСнастоящих слов? Как Π±Ρ‹ Π²Ρ‹ использовали ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ
tr
, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°
wordfreq
Ρ€Π°Π±ΠΎΡ‚Π°Π»Π° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, прописныС ΠΈΠ»ΠΈ строчныС Π±ΡƒΠΊΠ²Ρ‹ задСйствованы Π²ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅? Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹
wordfreq
, ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° ΠΈΠ· Ρ€Π°Π·Π΄. 4.2 ΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΠΎΠ³ΠΎ Π½ΠΈΠΆΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.

sed 's/[β†’][β†’]*/\

/q' $* | sort | uniq -c | sort -nr

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ

Π₯отя ΠΎΠ±Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΈ

sed
ΠΈ
awk
, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π·Π°Π΄Π°Ρ‡ Ρ‚ΠΈΠΏΠ° Π²Ρ‹Π±ΠΎΡ€Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ поля, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ
awk
ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΉ стСпСни, Π² ΠΊΠ°ΠΊΠΎΠΉ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ настоящСС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, которая Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅Ρ‚ Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ строки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π·Π°Π½ΠΈΠΌΠ°Π»ΠΈ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 80 ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ. КаТдая строка, ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΡŽΡ‰Π°Ρ 80 символов, Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ послС 80-Π³ΠΎ символа; Π² качСствС прСдупрСТдСния добавляСтся
\
ΠΈ обрабатываСтся остаток строки. Π₯вост Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅ΠΌΠΎΠΉ строки сдвигаСтся ΠΊ Π΅Π΅ ΠΏΡ€Π°Π²ΠΎΠΌΡƒ ΠΊΠΎΠ½Ρ†Ρƒ, Π° Π½Π΅ ΠΊ Π»Π΅Π²ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎ для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ, ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ поэтому ΠΌΡ‹ обратимся ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅
fold
. Рассмотрим, Π² частности, строки ΠΈΠ· 20, Π° Π½Π΅ ΠΈΠ· 80 ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ:

$ cat тСст

ΠšΠΎΡ€ΠΎΡ‚ΠΊΠ°Ρ строка

Π‘Ρ‚Ρ€ΠΎΠΊΠ° Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π»ΠΈΠ½Π½Π΅Π΅

Π­Ρ‚Π° строка Π΅Ρ‰Π΅ Π΄Π»ΠΈΠ½Π½Π΅Π΅, Ρ‡Π΅ΠΌ прСдыдущая строка

$ fold тСст

ΠšΠΎΡ€ΠΎΡ‚ΠΊΠ°Ρ строка

Π‘Ρ‚Ρ€ΠΎΠΊΠ° Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π»ΠΈΠ½Π½Π΅Π΅

Π­Ρ‚Π° строка Π΅Ρ‰Π΅ Π΄Π»ΠΈΠ½Π½Π΅Π΅,

Β Ρ‡Π΅ΠΌ прСдыдущая строка

$

Π’Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ странным, Ρ‡Ρ‚ΠΎ Π² сСдьмой вСрсии систСмы Π½Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ для добавлСния ΠΈΠ»ΠΈ удалСния символов табуляции, хотя ΠΊΠΎΠΌΠ°Π½Π΄Π°

pr
Π² System V выполняСт ΠΈ Ρ‚ΠΎ ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ΅. Наша рСализация ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹
fold
ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€
sed
, Ρ‡Ρ‚ΠΎΠ±Ρ‹ пСрСвСсти символы табуляции Π² ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ ΠΈ Ρ‡Ρ‚ΠΎΠ±Ρ‹ счСтчик числа символов Π²
awk
принял ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ способ ΠΏΡ€ΠΈ табуляции Π² Π½Π°Ρ‡Π°Π»Π΅ строки (Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΎ для языковых ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ), Π½ΠΎ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ сбиваСтся, Ссли символ табуляции оказываСтся Π² сСрСдинС строки:

# fold: fold long lines

sed 's/\(->/ /g' $* |Β Β Β Β Β  # convert tabs to spaces

awk '

Β BEGIN {

Β  N = 80Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β  # folds at column 80