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

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

Автор Π‘Ρ€Π°ΠΉΠ°Π½ ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½

$ sed 1q /etc/passwd | awk '{split($0, a, ":"); print a[1]}'

root

$ echo 9/29/83 | awk '{split($0, date, "/"); print date[3]}'

83

$

Π’ Ρ‚Π°Π±Π». 4.5 пСрСчислСны встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ awk.

cos(expr) ΠšΠΎΡΠΈΠ½ΡƒΡ expr exp(expr) Π’ΠΎΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ expr getline() Π§Ρ‚Π΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ строки; Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0 Π² случаС ΠΊΠΎΠ½Ρ†Π° Ρ„Π°ΠΉΠ»Π°, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС 1 index(s1, s2) ПолоТСниС строки s2 Π² s1; Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0, Ссли строка Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ int(expr) ЦСлая Ρ‡Π°ΡΡ‚ΡŒ expr; округляСт ΠΏΠΎ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΡƒ length(s) Π”Π»ΠΈΠ½Π° строки s log(expr) ΠΠ°Ρ‚ΡƒΡ€Π°Π»ΡŒΠ½Ρ‹ΠΉ Π»ΠΎΠ³Π°Ρ€ΠΈΡ„ΠΌ expr sin(expr) Бинус expr split(s, a, c) Π Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ s Π½Π° Π°[1] ... a[n] ΠΏΠΎ символу c; Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ n sprintf(fmt, ...) Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² соотвСтствии со спСцификациСй fmt substr(s,m,n) ΠŸΠΎΠ΄ΡΡ‚Ρ€ΠΎΠΊΠ° Π² n символов строки s, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰Π°ΡΡΡ с индСкса m

Π’Π°Π±Π»ΠΈΡ†Π° 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

  for (i = 1; i <= N; i++) # make a string of blanks

   blanks = blanks " "

 }

 {

  if ((n = length($0)) <= N)

   print

  else {

   for (i = 1; n > N; n -= N) {

    printf "%s\\\n", substr($0,i,N)

    i += N;

   }

   printf "%s%s\n" , substr(blanks, 1, N-n), substr($0, I)

  }

 } '

На языкС awk Π½Π΅Ρ‚ явной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ строк; строки ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ, Ссли ΠΎΠ½ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ подряд. Π’Π½Π°Ρ‡Π°Π»Π΅ blanks являСтся пустой строкой. Π¦ΠΈΠΊΠ» Π² части BEGIN создаСт Π΄Π»ΠΈΠ½Π½ΡƒΡŽ строку ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠ΅ΠΉ: ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ шаг Ρ†ΠΈΠΊΠ»Π° прибавляСт Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ±Π΅Π» ΠΊ ΠΊΠΎΠ½Ρ†Ρƒ строки blanks. Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅ входная строка разбиваСтся Π½Π° части, ΠΏΠΎΠΊΠ° ΠΎΡΡ‚Π°Π²ΡˆΠ°ΡΡΡ Ρ‡Π°ΡΡ‚ΡŒ Π½Π΅ станСт достаточно ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΉ. Как ΠΈ Π² языкС Π‘ΠΈ, ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ присваивания ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС выраТСния, поэтому Π² конструкции

if ((n=length($0)) <= N)...

Π΄Π»ΠΈΠ½Π° Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ строки присваиваСтся n Π΄ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ значСния. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° скобки.

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

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

ВзаимодСйствиС с ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ

Допустим, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π°ΠΌΠ΅Ρ€Π΅Π²Π°Π΅Ρ‚Π΅ΡΡŒ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ field n. Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ n-Π΅ ΠΏΠΎΠ»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ строки Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π°Π΄Π°Ρ‚ΡŒ:

$ who | field 1

для ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠΌΠ΅Π½, ΠΏΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ входят Π² систСму. Π―Π·Ρ‹ΠΊ awk явно прСдоставляСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€Π° ΠΏΠΎΠ»Π΅ΠΉ. Наша основная Π·Π°Π΄Π°Ρ‡Π° β€” ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ n ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ awk. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ:

$ awk '{print $'$1'}'

Π—Π΄Π΅ΡΡŒ $1 ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎ (Π½Π΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠ°ΠΊΠΈΡ… Π»ΠΈΠ±ΠΎ ΠΊΠ°Π²Ρ‹Ρ‡Π΅ΠΊ), ΠΈ поэтому становится Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ поля, доступным Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ awk. ΠŸΡ€ΠΈ ΠΈΠ½ΠΎΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ:

awk "{print \$$1}"

АргумСнт обрабатываСтся ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ, поэтому \$ становится $, Π° $1 замСняСтся Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ n. ΠœΡ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ с апострофами (ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΌΠΈ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈ использовании ΠΊΠ°Π²Ρ‹Ρ‡Π΅ΠΊ Π² Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ awk появится слишком ΠΌΠ½ΠΎΠ³ΠΎ символов \.