提问人:Niranjan 提问时间:11/1/2023 更新时间:11/2/2023 访问量:38
如何删除有关换行符的重复项?
How to remove duplicates respecting linebreaks?
问:
我正在使用这个答案从两个文件中删除重复项。假设由以下内容组成: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 grep
can I add multiple files to the set
comm -13 <(sort -u file1 file2 file3) <(sort file4
man 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
当你有奇怪的条件集时,你通常也可以很容易地将一个解决方案组合在一起,比如 或 。perl
awk
$: awk 'NR==FNR{x[$0]} $0 in x{next}1' file1 file2
cd
z
这两者都不需要对任一文件进行任何特定的排序。
评论