Использование awk

Использование awk

Мне интересно, как я могу проверить конец файла в цикле while. Что я здесь делаю, так это если есть какое-то слово, например, "pineapple", "apple", "onion", "orange" и т. д., я хочу найти строки, включающие определенные слова, с помощью команды grep и сделать какой-то комментарий "window". Например, если я использую grep 'a' 'file', то он найдет "pineapple", "apple" и "orange". Затем, наконец, я хочу, чтобы это было напечатано как "pineapple, window, apple, window, orange, window", что-то вроде этого. Поэтому я хотел бы сделать какое-то условие в цикле while или for. Любая помощь будет очень признательна.

редактировать: Примеры входных данных

apple
banana
pineapple
orange
mandu
ricecake
meat
juice
milk
onion
green onion

Ожидаемые результаты при использовании команды grep -->grep 'a' 'file name'

apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window

решение1

Использование awk

Чтобы напечатать windowпосле каждой совпадающей строки a:

$ awk '/a/{print; print "window"}' filename
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window

Как это работает

/a/{...}выбирает строки, соответствующие регулярному выражению a. Для каждой такой строки выполняются команды в фигурных скобках.

printпечатает строку, содержащую совпадение

print "window"отпечатки window.

Использование sed

$ sed -n '/a/{s/$/\nwindow/; p}' filename
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window

Как это работает

-nсообщает sed, что не следует печатать, пока мы явно не захотим этого.

/a/{...}выбирает строки, соответствующие регулярному выражению a. Для этих строк выполняются команды в фигурных скобках.

s/$/\nwindow/добавляет новую строку windowпосле конца текущей строки.

pотпечатки.

решение2

$ grep 'a' file | sed 'a\window'
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window

При этом используется исходная grepкоманда, а затем слово добавляется windowпосле каждой полученной строки с помощью aкоманды («append») в GNU sed(стандарт sedтребует новой строки после \and в конце вставленного текста, но GNU sedнемного более снисходителен).

Альтернативный вариант — использование только GNU sed:

$ sed -n -e '/a/{p;a\window' -e '}' file
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window

Выражение sedпечатает каждую строку, содержащую букву a, а затем добавляет строку window.

решение3

Оболочку можно использовать следующим образом:

while IFS= read -r line || [ -n "$line" ]; do
    case "$line" in
        *a*) printf "%s\nwindow\n" "$line"
    esac
done < input.txt

Он объединяет типичный while IFS= read -r line; do...done < file.txtцикл для чтения файлов, caseоператор для сопоставления строк, содержащих определенный символ, и printfдля печати этой дополнительной windowстроки.

Связанный контент