awk как объединить строку в цикле for и распечатать из раздела END

Я знаю, что это старый вопрос, но я тоже искал его. Если вы загрузите prompinit (autoload -Uz promptinit && promptinit), вы получите бесплатную опцию :$prompt_newline, то есть $'\n%{\r%}'.

В системе Debian исходный код можно найти в /usr/share/zsh/functions/Prompts/promptinitи/илиhttps://github.com/zsh-users/zsh/blob/master/Functions/Prompts/promptinit

-3
26.06.2020, 11:49
2 ответа

Кажется, вы хотите собрать все строки, соответствующие определенному шаблону, а затем напечатать их в конце.

Это можно сделать с помощью

awk '/^pattern/ { a[++n] = $0 }
     END { for (i = 1; i <= n; ++i) print a[i] }' file

Это использует aкак массив и добавляет каждую строку, соответствующую шаблону, как новую запись в массиве. В конце цикл перебирает записи aи печатает каждую.

Если вы хотите искать точную литеральную строку patternв первом столбце вместо сопоставления регулярного выражения со всей строкой, используйте $1 == "pattern"в качестве условия.

Однако, если это все , которые вы хотите сделать, то проще просто использовать

awk '/^pattern/' file

или, если вы хотите сопоставить литеральную строку patternв первом столбце,

awk '$1 == "pattern"' file

Это вызовет действие по умолчанию для каждой строки, которая соответствует шаблону или содержит patternв качестве первого столбца, если вы используете второй вариант. «Действие по умолчанию» — напечатать строку.


В awk, a += $0будет арифметической операцией, которая увеличивает значение aна текущую строку, интерпретируемую как число. Чтобы объединить строку как строку с переменной a, вы должны использовать a = a $0или a = a ORS $0, если вы хотите вставить новую строку (значение по умолчаниюORS)перед добавляемой строкой. Я полагаю, что ни то, ни другое вы не хотите здесь делать.

2
18.03.2021, 23:24

Если вы просто хотите напечатать все строки, первое поле которых pattern, нет необходимости хранить данные в памяти, вы можете просто распечатать каждую строку по мере ее нахождения:

awk '$1=="pattern"' file

Или даже

grep -w '^pattern' file

Если вместо этоговы хотите напечатать каждую строку, если любое из полей строки равно pattern, используйте:

awk '{ for(i=1; i<=NF; i++){ if($i=="pattern"){ print; next}}}' file

В качестве альтернативы, если вы просто ищете случаи, когда значение поля начинается с pattern, но могут иметь другие символы после (, что и пытался сделать ваш код ), используйте это если вам нужно только первое поле:

awk '$1~/^pattern/' file

и это для любого поля:

awk '{ for(i=1; i<=NF; i++){ if($i~/^pattern/){ print; next}}}' file
1
18.03.2021, 23:24

Теги

Похожие вопросы