UnixとSed初心者はここにあります!
要件があり、サフィックスを追加する必要があります。「あきらめる」レポートの行に一致する文字列が含まれている場合。一致する文字列が他のファイルの一部です。「放棄.txt」。私はまた、主要なレポートのコピーについてこれらのことを行ってみました。
以下に例を示します。
レポートは次のとおりです。
i love apple_tart as a desert
banana is full of potassium and iron
there are so many helath benefits of apple eating
the king of fruit is mango
there are apple_pie of many variety
これが方法ですあきらめるtxt良い:
apple_pie
banana
これは同じファイルから私が望む期待される出力です。
i love apple_tart as a desert
banana is full of potassium and iron,waive
there are so many helath benefits of apple eating
the king of fruit is mango
there are apple_pie of many variety,waive
私が試したスクリプトは次のとおりです。無効な変数名 間違い
#!/bin/csh -f
if (-r fruits_bkup.txt) then
rm fruits_bkup.txt
endif
yes|cp fruits.txt fruits_bkup.txt
foreach word ("`cat waiver.txt`")
sed -i "/${word}/s/$/ ,waived/" fruits_bkup.txt
end
sedコマンドで二重引用符を一重引用符に置き換えると、レポートに何の変更もありません。
ありがとうございます!
私は期待した:
i love apple_tart as a desert
banana is full of potassium and iron,waive
there are so many helath benefits of apple eating
the king of fruit is mango
there are apple_pie of many variety,waive
得る: 無効な変数名 間違い
答え1
シェルの問題を回避するために、単一のコマンドでこの問題を解決できます(csh
必要に応じてawk
スクリプトに入力)。csh
これにより、入力ファイルに必要なパスの数を減らすことができます(パスは1つだけ必要です)。
awk 'NR==FNR { query[++n] = $0; next } { for (i in query) if ($0 ~ query[i]) { $0 = $0 ",waive"; break } };1' waive.txt report.txt
このコマンドは最初に最初のファイルの行をwaive.txt
連想配列に読み込みますquery
。 2番目のファイルに到達したら、のパターンをreport.txt
繰り返し、query
現在の行に対して各パターンをテストします。一致するものがあれば、行の,waive
末尾に追加してループを終了します。
最後に、末尾は1
(修正可能な)行が出力されるようにします。
これは、最初のファイルのテキストを正規表現として使用することに注意してください。文字列比較を実行するには、コードでindex(query[i],$0)
inを使用してください$0 ~ query[i]
。
結果を元のファイルに書き戻すには、出力をにパイプするか、sponge report.txt
新しいファイル名にリダイレクトしてから、新しいファイルの名前をreport.txt
.