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

これは、元のコマンドを使用し、 GNU の ("append") コマンドを使用して、結果の各行の後にgrep単語を追加します(標準では、挿入されたテキストの後に改行が必要ですが、GNU はもう少し寛容です)。windowasedsed\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行を印刷するためのステートメントを組み合わせたものです。

関連情報