使用sed / awk从一个文件中使用Output来删除或取消注释另一个文件中的行

时间:2014-10-15 09:12:17

标签: awk sed

所以我有一个巨大的文件(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摆弄,但从来没有让它工作

2 个答案:

答案 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,因此打印的任何行都会打印,因为默认操作是打印该行。