要求:在文件 A 的每一行的开头添加一些内容(即 #),该文件是来自文件 B 的 grep
文件A
abcd
abdc
sdfg
asdfa
jon
ram
文件B
jon
abcd
从文件A中grep文件B并在文件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中。第二个 sed 在与变量 $x 中存储的任何模式匹配的行的开头插入 #。
答案2
我可以使用以下 oneliner 来做到这一点:
sed "$(for str in $(cat fileB); do echo -n "s/$str/#\0/; "; done;)" fileA
该sed
命令是通过循环 fileB 在子 shell 中构建的。然后用 a#
和匹配的行替换匹配的行。