删除包含相同第一个单词的行

时间:2017-09-28 16:49:33

标签: bash

我有两个文本文件1.txt2.txt。如果2.txt上任意行的第一个单词位于文件1.txt上,我想将其从1.txt中删除。例如:

的1.txt:

1 HI
2 HELLO
FIND 5
RESUME 1

2.txt:

1
FIND

结果将是:

3.txt:

2 HELLO
RESUME 1

2 个答案:

答案 0 :(得分:0)

这样做,但我假设直接修改1.txt也没有问题。

while read line 
do

    sed -E -i "/^$line/ s/.*/THISISAREMOVEDLINE1234567890/g" 1.txt


done < <(cat 2.txt )

grep -v 'THISISAREMOVEDLINE1234567890' 1.txt > final_output.txt

让我知道它是否适合您。 :)

ubuntu$ cat final_output.txt
2 HELLO
RESUME 1

答案 1 :(得分:0)

JOIN="$(cat 2.txt | tr -d "\r"| xargs -n 1 printf "%s " | sed 's/|/\\|/g;s/ $//;s/ /|/g')"

cat 1.txt | grep -vE "^($JOIN)"
> 2 HELLO
> RESUME 1

说明:

首先将第一个文件转换为条形分隔列表,使其看起来像这样

"1|FIRST"

我是通过使用tr删除&#39; \ r&#39;如果您碰巧是Windows,这将清理一些东西(是的bash可以在Windows上运行)然后我使用xargs将每行重新格式化为空格分隔列表。然后sed删除尾随空格,将其他空格转换为条形。另请注意,我首先逃离现有的栏,这样如果一个toke恰好包含一个栏,你就不会有奇怪的行为。即:

1
FIRST|ONE
TACO

变为

"1|FIRST\|ONE|TACO"

现在将其传递给grep with -v告诉grep删除匹配项,-E允许扩展正则表达式支持,这允许我们使用bar来指定匹配组。

cat 1.txt | grep -vE "^(1|FIRST)"

将删除以&#39; 1&#39;开头的所有文件或者&#39; FIRST&#39;。