所以我有一个巨大的文件(file1),我需要删除或删除特定的行,这个文件看起来像这样:
Lorem ipsum **abc** dolor sit amet,
consectetur adipiscing elit.
Cras finibus **123** laoreet dignissim.
Curabitur dignissim auctor tortor a cursus.
Nullam sapien ante, tempor eu rutrum
...
为此我有file2,其中包含我需要在file1中找到行的字符串
file2可能如下所示:
abc
123
xyz
098
...
现在,当找到来自file2的字符串时,应该取消注释或删除file1中找到它的行+它下面的行。 如果在上面的示例中找到 123 ,则应删除这两行(标有 - >):
Lorem ipsum abc dolor sit amet,
consectetur adipiscing elit.
--> Cras finibus 123 laoreet dignissim.
--> Curabitur dignissim auctor tortor a cursus.
Nullam sapien ante, tempor eu rutrum
...
我希望这是有道理的
我用sed和awk摆弄,但从来没有让它工作
答案 0 :(得分:1)
这可能适合你(GNU sed):
sed 's|.*|/&/{N;d}|' file2 | sed -f - file1 >file3
从file2创建一个sed脚本并对file1运行它,将结果保存在file3中。</ p>
答案 1 :(得分:1)
这样的事情会起作用:
awk 'NR==FNR{a[$0]; next}p{p=0;next}{for(i in a)if(p = $0 ~ i)next}1' file2 file1
使用a
中的行填充数组file2
。第一个块仅适用于file2
,因为总记录号NR
等于当前文件FNR
的记录号。 next
跳过其余的块。
对于file1
的每一行,循环遍历数组a
中的键。如果当前行与键匹配,则跳过输出中的行。同时为p
指定真值。对于p
为真的行,将其设置为false但跳过输出中的行。最后的1
始终为true,因此打印的任何行都会打印,因为默认操作是打印该行。