以下に例を示します。

以下に例を示します。

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.

関連情報