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

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

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

wc $* |

awk '!/total$/ { n += int(($1+55)/56) }

     END       { print n }'

$

Команда pr ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π½Π° ΠΊΠ°ΠΆΠ΄ΡƒΡŽ страницу 56 строк тСкста (это число опрСдСляСтся эмпиричСски). Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки Π²Ρ‹Π²ΠΎΠ΄Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ wc, которая Π½Π΅ содСрТит слово total Π² ΠΊΠΎΠ½Ρ†Π΅ строки, число страниц округляСтся, Π° Π·Π°Ρ‚Π΅ΠΌ выдСляСтся цСлая Ρ‡Π°ΡΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ встроСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ int.

$ wc ch4.*

 753  3090 18129 ch4.1

 612  2421 13242 ch4.2

 637  2462 13455 ch4.3

 802  2986 16904 ch4.4

  50   213  1117 ch4.9

2854 11172 62847 total

$ prpages ch4.*

53

$

Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ этого Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° запустим ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ pr ΠΈ awk ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ:

$ pr ch4.* | awk 'END {print NR/66}'

53

$

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ awk ΠΌΠΎΠ³ΡƒΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ строки символов. Π Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΊΠ°ΠΊ число ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ строку символов β€” зависит ΠΎΡ‚ контСкста. Π“Ρ€ΡƒΠ±ΠΎ говоря, Π² арифмСтичСских выраТСниях Ρ‚ΠΈΠΏΠ° s+=$1 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ числовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² контСкстС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ со строками Ρ‚ΠΈΠΏΠ° x=="abc" β€” строковоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² нСясных случаях, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ x>y, β€” строковоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ явно числовыми. (ΠŸΡ€Π°Π²ΠΈΠ»Π° Ρ‡Π΅Ρ‚ΠΊΠΎ сформулированы Π² справочном руководствС ΠΏΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ awk.) Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΡƒΡŽΡ‚ΡΡ пустой строкой. Π’ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… строки Π±ΡƒΠ΄ΡƒΡ‚ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ.

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ awk Π΅ΡΡ‚ΡŒ нСсколько своих встроСнных ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΎΠ±ΠΎΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ², Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ NR ΠΈ FS. Π˜Ρ… ΠΏΠΎΠ»Π½Ρ‹ΠΉ список ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² Ρ‚Π°Π±Π». 4.3, Π° Π² Ρ‚Π°Π±Π». 4.4 пСрСчислСны ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, выполняСмыС ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ.

FILENAME Имя Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° FS Π‘ΠΈΠΌΠ²ΠΎΠ» раздСлСния ΠΏΠΎΠ»Π΅ΠΉ (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ приняты ΠΏΡ€ΠΎΠ±Π΅Π» ΠΈ символ табуляции) NF Число ΠΏΠΎΠ»Π΅ΠΉ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ строки NR Число Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… строк OFMT Π€ΠΎΡ€ΠΌΠ°Ρ‚ Π²Ρ‹Π²ΠΎΠ΄Π° чисСл (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ принят %g; ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ руководству ΠΏΠΎ printf(3y)) OFS Π‘Ρ‚Ρ€ΠΎΠΊΠ° Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ ΠΏΠΎΠ»Π΅ΠΉ Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ (ΠΏΡ€ΠΎΠ±Π΅Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) ORS Π‘Ρ‚Ρ€ΠΎΠΊΠ°-Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ строк Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ (символ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) RS Π‘ΠΈΠΌΠ²ΠΎΠ» раздСлСния Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… строк (символ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ)

Π’Π°Π±Π»ΠΈΡ†Π° 4.3: ВстроСнныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ awk


= += -= /= %= ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅; v ΠΎΡ€=expr Π΅ΡΡ‚ΡŒ v=v op (expr) || Π˜Π›Π˜: expr1 || expr2 истина, Ссли ΠΎΠ΄Π½ΠΎ ΠΈΠ»ΠΈ ΠΎΠ±Π° истинны; expr2 Π½Π΅ вычисляСтся, Ссли expr1 истинна && И: expr1 && expr2 истина, Ссли ΠΎΠ±Π° истинны; expr2 Π½Π΅ вычисляСтся, Ссли expr1 лоТь ! ΠžΡ‚Ρ€ΠΈΡ†Π°Π½ΠΈΠ΅ значСния выраТСния >>= <<= == != ~ !~ ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ; ! ΠΈ !~ это соотвСтствиС ΠΈ нСсоотвСтствиС пусто ΠšΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΡ строк + - Π‘Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅ * / % Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π΄Π΅Π»Π΅Π½ΠΈΠ΅, вычислСниС остатка ++ -- Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ (прСфиксноС ΠΈΠ»ΠΈ постпрСфиксноС)

Π’Π°Π±Π»ΠΈΡ†Π° 4.4: ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, выполняСмыС awk (Π² порядкС возрастания ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°)


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

Наша ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ prpages подсказываСт ΠΈΠ½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΠΎΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, какая ΠΈΠ· Π½ΠΈΡ… выполняСтся быстрСС.

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅

ΠŸΡ€ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ большого Ρ„Π°ΠΉΠ»Π° ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ (судя ΠΏΠΎ ΠΎΠΏΡ‹Ρ‚Ρƒ) случайно ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ копию сосСднСго слова, Ρ‡Ρ‚ΠΎ практичСски Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ происходит ΠΏΡ€Π΅Π΄Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ. Для устранСния Ρ‚Π°ΠΊΠΈΡ… ошибок Π² сСмСйствС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Writers Workbench (Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ Π½Π°Π±ΠΎΡ€ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°) сущСствуСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° double, ΠΎΡ‚Ρ‹ΡΠΊΠΈΠ²Π°ΡŽΡ‰Π°Ρ ΠΏΠ°Ρ€Ρ‹ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹Ρ… сосСдних слов. НиТС ΠΏΠΎΠΊΠ°Π·Π°Π½Π° рСализация этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ awk:

$ cat double

awk '

FILENAME != prevfile { # new file

 NR = 1                # reset line number

 prevfile = FILENAME

}

NF > 0 {

 if ($1 == lastword)

  printf "double %s, file %s, line %d\n" ,$1, FILENAME, NR

 for (i = 2; i <= NF; i++)

  if ($i == $(i-1))

   printf "double %s, file %s, line %d\n", $i, FILENAME, NR

 if (NF > 0)

  lastword = $NF

}' $*

*

$

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ ++ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π°Π²Ρ‚ΠΎΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°, Π° опСрация -- β€” Π΅Π³ΠΎ Π°Π²Ρ‚ΠΎΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅.

ВстроСнная пСрСмСнная FILENAME Ρ…Ρ€Π°Π½ΠΈΡ‚ имя Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ NR подсчитываСтся число строк с Π½Π°Ρ‡Π°Π»Π° Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΌΡ‹ измСняСм Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ всякий Ρ€Π°Π· ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚ΠΎΡ‡Π½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ строку с Π΄Π²ΠΎΠΉΠ½ΠΈΠΊΠΎΠΌ.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ if β€” Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, ΠΊΠ°ΠΊ Π² языкС Π‘ΠΈ:

if (условиС)

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

else

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

Если условиС Π²Π΅Ρ€Π½ΠΎ, Ρ‚ΠΎ выполняСтся ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€1; Ссли ΠΎΠ½ΠΎ Π»ΠΎΠΆΠ½ΠΎ ΠΈ Ссли Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ присутствуСт, Ρ‚ΠΎ выполняСтся ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€2. ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°.

Π¦ΠΈΠΊΠ» for Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ Ρ‚Π°ΠΊΠΎΠ²ΠΎΠΌΡƒ Π² языкС Π‘ΠΈ, Π½ΠΎ отличаСтся ΠΎΡ‚ Ρ†ΠΈΠΊΠ»Π° Π² языкС shell:

for (Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅1; условиС; Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅2)

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

Π¦ΠΈΠΊΠ» for ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π΅Π½ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡƒ Π½ΠΈΠΆΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ допустим Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ awk:

Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅1 while (условиС) {

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

 Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅2

}

НапримСр, конструкция

for (i=2; i <= NF; i++)

являСтся Ρ†ΠΈΠΊΠ»ΠΎΠΌ с i, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΌ значСния 2, 3 ΠΈ Ρ‚.Π΄., Π²ΠΊΠ»ΡŽΡ‡Π°Ρ число ΠΏΠΎΠ»Π΅ΠΉ NF.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ break Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· Ρ†ΠΈΠΊΠ»Π° while ΠΈΠ»ΠΈ for; ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ continue ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΡˆΠ°Π³Ρƒ Ρ†ΠΈΠΊΠ»Π° (ΠΊ ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ while ΠΈΠ»ΠΈ ΠΊ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ2 Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ for). ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ next Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ строки ΠΈ сопоставлСниС Π΅Π΅ с шаблонами с Π½Π°Ρ‡Π°Π»Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ awk, Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ exit β€” Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° дСйствия, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π² шаблонС END.

ΠœΠ°ΡΡΠΈΠ²Ρ‹

Как ΠΈ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ языков программирования, Π² awk Π΅ΡΡ‚ΡŒ массивы. Π’ качСствС простого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ awk, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ каТдая входная строка заносится Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт массива, индСксируСмого Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ строки, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ½ΠΈ ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΡŽΡ‚ΡΡ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС:

$ cat backwards

# backwards: print input in backward line order

awk ' { line[NR] = $0 }

END   { for (i = NR; i > 0; i--) print line[i] } ' $*

$

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ, массивы Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ; Ρ€Π°Π·ΠΌΠ΅Ρ€ массива ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ объСмом памяти, доступным Π½Π° вашСй машинС. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ссли ΠΎΡ‡Π΅Π½ΡŒ большой Ρ„Π°ΠΉΠ» заносится Π² массив, Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², это ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΠΈΡΡ‡Π΅Ρ€ΠΏΠ°Π½ΠΈΡŽ рСсурсов памяти. Для ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ ΠΊΠΎΠ½Ρ†Π° большого Ρ„Π°ΠΉΠ»Π° Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС слСдуСт ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ Π·Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ tail:

$ tail -5 /usr/dict/web2 | backwards

zymurgy

zymotically

zymotic

zymosthenic

zymosis

$

Команда tail ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ возмоТности Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы β€” ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ "поиск" (seeking), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΠΊΠΎΠ½Ρ†Ρƒ Ρ„Π°ΠΉΠ»Π° Π±Π΅Π· чтСния всСй ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ эта опСрация Π±ΡƒΠ΄Π΅Ρ‚ рассмотрСна ΠΏΡ€ΠΈ обсуТдСнии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ lseek Π² Π³Π». 7. (Π’ нашСй ΠΊΠΎΠΌΠ°Π½Π΄Π΅ tail Π΅ΡΡ‚ΡŒ Ρ„Π»Π°Π³ -r, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ строк Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС, замСняя ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ backwards).

ΠŸΡ€ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ входная строка разбиваСтся Π½Π° поля. Π­Ρ‚Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ встроСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ split Π½Π°Π΄ любой строкой:

n = split(s, arr, sep)

Π‘Ρ‚Ρ€ΠΎΠΊΠ° s разбиваСтся Π½Π° поля, записываСмыС Π² элСмСнты массива arr ΠΎΡ‚ 1 Π΄ΠΎ n. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ символ раздСлСния ΠΏΠΎΠ»Π΅ΠΉ sep, Ссли ΠΎΠ½ Π·Π°Π΄Π°Π½; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС примСняСтся Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ FS. НапримСр, ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ split($0, Π°, ":") Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅Ρ‚ Π²Ρ…ΠΎΠ΄Π½ΡƒΡŽ строку Π½Π° столбцы, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ„Π°ΠΉΠ»Π° /etc/passwd, поэтому ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ split("9/29/83", date, "/") Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅Ρ‚ Π΄Π°Ρ‚Ρƒ ΠΏΠΎ символам Π΄Ρ€ΠΎΠ±Π½ΠΎΠΉ Ρ‡Π΅Ρ€Ρ‚Ρ‹.

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