在文本文件中,如何仅打印第一列重复但第二列不同的行?我想调和这些差异。可能使用awk/sed/bash?打印第一列匹配的行,第二列不同
输入:
Jon AAA
Jon BBB
Ellen CCC
Ellen CCC
输出:
Jon AAA
Jon BBB
注意,真正的文件没有排序。
感谢您的任何帮助。
在文本文件中,如何仅打印第一列重复但第二列不同的行?我想调和这些差异。可能使用awk/sed/bash?打印第一列匹配的行,第二列不同
输入:
Jon AAA
Jon BBB
Ellen CCC
Ellen CCC
输出:
Jon AAA
Jon BBB
注意,真正的文件没有排序。
感谢您的任何帮助。
这一行应该做的:(我打破了一个班轮到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
p
中,以便相同的$ 1,$ 2组合不会多次打印。p
这将重新排列输出中的顺序。不知道这是否有问题。 – 2014-09-03 22:29:59
不,这不会保留@TomFenech的发生顺序。我们可以做到这一点,但它需要更多的检查也需要另一个数组来保存订单信息。 – Kent 2014-09-03 22:31:36
@Kent很好的解决方案,但不清楚OP需要什么。例如,如果你在最后引入一行'Jon AAA',它仍然会打印该行,即使该行是重复的。 – 2014-09-04 01:01:14
sort file | uniq -u
的索引将仅打印唯一的行。
除非你需要排序,否则你可以删除'sort'并简单地使用:'uniq -u file'。 – 2014-09-03 22:49:42
我怀疑这是否是OP想要的。如果在他的例子中有另一行:'FOO BAR',你的uniq会将它输出。但根据我的理解,他可能不想要那条线。 – Kent 2014-09-03 22:52:19
@ DavidC.Rankin,在之前的评论中,OP表示这些行将是“混合和随机的”,因此是种类。 – 2014-09-04 03:22:59
只是一个普通的独特的排序应该工作
awk '!a[$0]++' test
这可能会为你工作:
sort file | uniq -u | rev | uniq -Df1 | rev
此排序文件,删除任何重复的行,反转线,删除和独特的线是没有相同的密钥(保留第二个字段相同的重复项),并将该行反转到其原始位置。
这将删除单重键的重复行和行。
这些条目是否总是按照您的示例分组? – 2014-09-03 22:20:13
不,混合和随机 – user1899415 2014-09-03 22:21:09
在第一列中是否有超过两行的值相同?如果是这样,会发生什么? – 2014-09-03 22:22:12