2014-09-03 87 views
0

在文本文件中,如何仅打印第一列重复但第二列不同的行?我想调和这些差异。可能使用awk/sed/bash?打印第一列匹配的行,第二列不同

输入:

Jon AAA 
Jon BBB 
Ellen CCC 
Ellen CCC 

输出:

Jon AAA 
Jon BBB 

注意,真正的文件没有排序。

感谢您的任何帮助。

+0

这些条目是否总是按照您的示例分组? – 2014-09-03 22:20:13

+0

不,混合和随机 – user1899415 2014-09-03 22:21:09

+0

在第一列中是否有超过两行的值相同?如果是这样,会发生什么? – 2014-09-03 22:22:12

回答

1

这一行应该做的:(我打破了一个班轮到3线更好的阅读)

awk '!($1 in a) {a[$1]=$2;next} 
    $1 in a && $2!=a[$1]{p[$1 FS $2];p[$1 FS a[$1]]} 
    END{for(x in p)print x}' file 
  • 一号线节省$ 1 $ 2到数组,如果它被选中第一次
  • line2:对于现有的$ 1和不同的$ 2,将它们(两行)放入一个数组p中,以便相同的$ 1,$ 2组合不会多次打印。
  • 打印阵列p
+0

这将重新排列输出中的顺序。不知道这是否有问题。 – 2014-09-03 22:29:59

+0

不,这不会保留@TomFenech的发生顺序。我们可以做到这一点,但它需要更多的检查也需要另一个数组来保存订单信息。 – Kent 2014-09-03 22:31:36

+0

@Kent很好的解决方案,但不清楚OP需要什么。例如,如果你在最后引入一行'Jon AAA',它仍然会打印该行,即使该行是重复的。 – 2014-09-04 01:01:14

1
sort file | uniq -u 

的索引将仅打印唯一的行。

+0

除非你需要排序,否则你可以删除'sort'并简单地使用:'uniq -u file'。 – 2014-09-03 22:49:42

+0

我怀疑这是否是OP想要的。如果在他的例子中有另一行:'FOO BAR',你的uniq会将它输出。但根据我的理解,他可能不想要那条线。 – Kent 2014-09-03 22:52:19

+0

@ DavidC.Rankin,在之前的评论中,OP表示这些行将是“混合和随机的”,因此是种类。 – 2014-09-04 03:22:59

0

只是一个普通的独特的排序应该工作

awk '!a[$0]++' test 
1

这可能会为你工作:

sort file | uniq -u | rev | uniq -Df1 | rev 

此排序文件,删除任何重复的行,反转线,删除和独特的线是没有相同的密钥(保留第二个字段相同的重复项),并将该行反转到其原始位置。

这将删除单重键的重复行和行。

相关问题