Я думаю, что проблема здесь в том, что у вас сложилось впечатление, что цикл for заставит awk пройти по вашему входному файлу, в то время как в природе awk это уже делается.
Awk работает, беря набор из condition { statement }
пар, а затем FOR EACH LINE OF INPUT, оценивая условие и, если оно звучит как true, выполняет инструкцию. Обратите внимание, что условия могут быть операторами (поскольку функции и другие команды имеют возвращаемое значение), а операторы могут включать конструкции if
, поэтому здесь есть большая гибкость.
Обратите внимание, что awk также может уменьшить или упростить то, что вы делаете в скрипте оболочки. Учтите следующее:
#!/bin/sh
file="$1"
awk '
NR==FNR {
ClientCount++
next
}
FNR==1 {
printf "%s: %d\n", FILENAME, ClientCount
}
{
print $1, $2, $3
}
' "$file" "$file"
Этот сценарий читает ваш входной файл дважды - один раз для подсчета строк (чтобы счетчик строк мог быть размещен в верхней части выходного файла), и один раз для обработки строк, печатая первые три поля. Сценарий состоит из трех condition { statement }
группировок:
- Первый счетчик. Он работает только с первым экземпляром файла, и команда
next
гарантирует, что никакие другие команды не будут выполняться для этого файла.
- Второй работает с первой строкой файла. Но поскольку первое условие захватывает весь первый файл, этот оператор будет выполнен только один раз, когда первая строка второго файла будет воспроизведена.
- Третий - это то, что печатает большую часть вашей продукции. В awk, когда условие не включено, условие считается «истинным», поэтому этот оператор выполняется для каждой строки второго файла.
Скрипт awk, конечно, можно сжать в одну строку, я разложил его для удобства чтения.
Обратите внимание, что этот метод сохранения или отображения количества строк может быть немного сложным. Если вы знаете, что просто показывает количество строк, вы можете использовать внутреннюю переменную awk NR
. В точке вашего скрипта, где оценивается второе условие, NR-1
- это количество строк предыдущего файла, поэтому вы можете использовать:
#!/bin/sh
file="$1"
awk '
NR==FNR {
next
}
FNR==1 {
printf "%s: %d\n", FILENAME, NR-1
}
{
print $1, $2, $3
}
' "$file" "$file"