“-”在使用uniq时覆盖文件而不是代表stdin,为什么?

问题描述 投票:0回答:1

我正在尝试查找两个文件之间的唯一条目。我们称它们为file1file2file1未排序,file2已预先排序。

我尝试了以下操作:

sort file1 | uniq -u - file2

[我预期会发生的是,-将被解释为stdin,因此uniq将采用先前的结果并将其与file2进行比较,并打印两个文件中唯一的条目。

然而,发生的是file2file1的内容覆盖。这让我感到震惊,因为我不认为我的命令包含任何会导致文件被写入/覆盖的元素(例如> or >>)。

谁能解释为什么file 2被覆盖而不是命令按预期执行?


PS。我也尝试了以下方法:

uniq -u <(sort file1) file2

[这也导致file2file1的内容覆盖。这是完全出乎意料的行为。

编辑:代表

重现问题

echo -e "aaaaaaaa\nbbbbbbbb\ncccccc\n" > file2
echo -e "bbbbbbb\naaaaaaaa\ndddddddd\n" > file1

sort file1 | uniq -u - file2
#Or uniq -u <(sort file1) file2

#demonstrate the file 2 has changed
cat file2

我所期望的

$sort file1 | uniq -u - file2
cccccc
dddddddd

$cat file2
aaaaaaaa
bbbbbbbb
cccccc

我得到了什么

$sort file1 | uniq -u - file2  #no output
$cat file2

aaaaaaaa
bbbbbbb
dddddddd
linux bash shell command-line uniq
1个回答
0
投票

尝试

uniq -u <(sort file1) <file2

来自手册页

提要uniq [OPTION] ... [INPUT [OUTPUT]]

说明从INPUT(或标准输入)中过滤相邻的匹配线,然后写入OUTPUT(或标准输出)。

[uniq -u <(sort file1) file2-在这里它正在写入OUTPUT,即file2

演示:

$cat file1.txt 
1
2
3
4
5
$cat file2.txt 
1
2
3
$uniq -u <(sort file1.txt)   <file2.txt
1
2
3
4
5
$
© www.soinside.com 2019 - 2024. All rights reserved.