如何删除有关换行符的重复项?

How to remove duplicates respecting linebreaks?

提问人:Niranjan 提问时间:11/1/2023 更新时间:11/2/2023 访问量:38

问:

我正在使用这个答案从两个文件中删除重复项。假设由以下内容组成:file1

a
b
c
d

和 file2:

a
b
c
cd
z

运行后:

grep -F -v -f file1 file2 > file3

我在 file3 中得到这个:

z

我理解为什么它会删除包含 的行,但我想停止这种行为。怎么做呢?cz

sed-也欢迎解决方案。我从这个答案中尝试了以下方法,效果相同:file3

sed $(awk '{printf("-e /%s/d ", $1)}' file1) file2 > file3
塞德 ·格雷普

评论


答:

2赞 KamilCuk 11/1/2023 #1

若要从另一个文件中的行中删除一组中存在的行,可以:

comm -13 <(sort file1) <(sort file2)

怎么做呢?

用于匹配整条线。-x

评论

0赞 Niranjan 11/1/2023
感谢您的即时回复。除了所有标志之外,还可以使用或替代某些标志,例如?-x-v
0赞 Niranjan 11/1/2023
另外,你说“一套”。那么,我是否可以将多个文件添加到该集合中,并从特定文件中删除该集中找到的所有行并生成一个新行?
1赞 KamilCuk 11/1/2023
Using -x in addition to all看。 据我了解),请参阅。man grepcan I add multiple files to the setcomm -13 <(sort -u file1 file2 file3) <(sort file4man comm
0赞 Niranjan 11/1/2023
谢谢你的解释。我会检查资源。
3赞 potong 11/1/2023 #2

这可能对你有用 (GNU sed):

sed 's#.*#/\\<&\\>/d#' file1 | sed -f - file2

将 file1 转换为 sed 脚本并将其应用于 file2。

对于每一行 file1,sed 脚本是正则表达式形式的地址和删除命令(如果正则表达式匹配)。

正则表达式匹配单词(并匹配单词边界的开头和结尾)。\<\>

使用该选项将第一个 sed 命令的输出通过管道传递到第二个 sed 调用中,并将 file2 指定为输入文件。-f -

注意加倍以避免被外壳误解。\

1赞 Paul Hodges 11/1/2023 #3

grep有一个简单的命令行选项: .-x

$: grep -vxFf file1 file2
cd
z

如果由于某种原因,您的版本没有 ,使您的模式文件强制执行相同的结果(并删除 )。grep-x-F

$: sed -i 's/^/^/; s/$/$/;' file1
$: cat file1
^b$
^c$
^a$
^d$
$: grep -vf file1 file2
cd
z

当你有奇怪的条件集时,你通常也可以很容易地将一个解决方案组合在一起,比如 或 。perlawk

$: awk 'NR==FNR{x[$0]} $0 in x{next}1' file1 file2
cd
z

这两者都不需要对任一文件进行任何特定的排序。