要件:ファイルBのgrepであるファイルAの各行の先頭に何か(例:#)を追加します。
ファイルA
abcd
abdc
sdfg
asdfa
jon
ram
文書B
jon
abcd
ファイルAからファイルBをgrepし、ファイルAの先頭に「#」文字を追加します。
出力は
#abcd
abdc
sdfg
asdfa
#jon
ram
答え1
一方通行:
awk 'NR==FNR{a[$0];next}$0 in a{printf "#";}1' fileB fileA
説明する:
NR==FNR{a[$0];next}
=> awkはfileBを配列として読み込みます。
$0 in a{printf "#";}
=> fileAの行のいずれかが配列の内容と一致する場合は、先頭に#を追加します。
1
=> fileAの各行を印刷します。
sedを使用してください:
$ x=$(sed -e :a -e 'N;s/\n/\\|/;ta' FileB)
$ sed "s/$x/#&/" FileA
最初の sed コマンドは、すべての行が文字列として一緒に連結され、「|」で区切られた文字列を準備します。 $xに保存されます。 2番目のsedは、$ x変数に格納されているパターンと一致する行の先頭に#を挿入します。
答え2
次の oneliner を使用してこれを行うことができます。
sed "$(for str in $(cat fileB); do echo -n "s/$str/#\0/; "; done;)" fileA
コマンドsed
はfileBを繰り返してサブシェルに設定されます。次に、#
一致する行をaと一致する行に置き換えます。