2016-06-11 47 views
0

也许有人可以帮我解决以下问题。删除重复项(两行)和复制只基于一个子字符串

我使用:

cat file1 file2 | sort -t} -k2 | less 

输出包含重复从位置5线

A01} value1 = 5000000000 
B01} value1 = 5000000000 
A01} value2 = 6000000000 
B01} value2 = 7000000000 

当比较起始如何删除这些两条线:从

A01} value1 = 5000000000 
B01} value1 = 5000000000 

完全我的输出?

结果应该是:

A01} value2 = 6000000000 
B01} value2 = 7000000000 
+0

要明确,您希望独特的值=? –

回答

2

我认为要排序使用领域从键2(值)/ uniq的到键4(数量)。因此,当调用uniq时,字段1被跳过:

cat file1 file2 |sort -k 2,4 |uniq --skip-fields=1 --unique 
+0

不知道'--skip-fields',这个答案比我下面给出的答案要好。我唯一担心的是*如果*这是一个仅限于GNU的功能? – andlrc

+0

是的,这是一个GNU /非posix功能。我认为提问者使用的是GNU系统,因为他使用了'bash'标签 –

0

像这样的事情可能会为你工作:

% grep -vFf <(cut -d'}' -f2 file.txt | sort | uniq -d) file.txt 
A01} value2 = 6000000000 
B01} value2 = 7000000000 

这将创建一个包含所有非唯一行 “文件”:

cut -d'}' -f2 file.txt | sort | uniq -d 

<(...)是一个过程替换,其工作原理如下:

% echo <(ls) 
/proc/self/fd/11 

的grep -F意味着纯文本搜索,并-f愿与关键字来搜索文件名。 -v反转比赛。

而对于乘文件,你需要-h对比赛抑制名:

grep -hvFf <(cut -d'}' -f2 a.txt b.txt | sort | uniq -d) a.txt b.txt 
+0

我认为他们正在两个文件(文件1中的A值,文件2中的B值)之间搜索,在这种情况下,您可能需要放置'... file1.txt file2.txt'。 –

+0

杀了它的男人。有趣的使用grep! –

+0

可能只是简单地添加$(cat file1 file2)inplace file.txt并且将其称为一天 - 尝试使用反引号,但由于某些原因,此网站反感反引号。大声笑 –