我有两个文本文件1.txt
和2.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
答案 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;。