我有一个包含如下行的排序文件
word1 abca
word1 abcb
word1 abcc
word2 abca
word2 abcb
word3 abbb
...........
我想要这样的东西
word1 abca
word2 abca
word3 abbb
...........
答案1
这个神奇的咒语是一个著名的 awk 习语:
awk '!seen[$1]++' file
第一次看到包含 $1 的行时,将打印该行。
答案2
awk 解决方案 - 使用变量检测新词。如果发现新词,则打印该行并将变量分配给当前词。
由于数据文件已排序,因此只有每个单词第一次出现时才会打印记录。
awk 'BEGIN{w=""} w!=$1 {print;w=$1}' your-file
答案3
您还可以使用标志-w
来uniq
告诉它仅比较前 N 个字符。这是否适合您的详细信息取决于您的实际数据,但如果设置或限制了字长,它应该可以工作:
$ sort file.txt | uniq -w 5
word1 abca
word2 abca
word3 abbb
或者,反转字段的顺序并使用uniq -f 1
跳过比较第一个字段:
$ awk '{print $2,$1}' file.txt | uniq -f 1 | awk '{print $2,$1}'
word1 abca
word2 abca
word3 abbb
或者获取第一个字段,然后grep
将搜索限制在第一个匹配项:
$ for i in $(awk '{print $1}' file.txt | sort -u); do grep -m 1 $i file.txt; done
word1 abca
word2 abca
word3 abbb
并且,为了完整起见,这里有一个 Perl 版本:
$ perl -ane 'print if $k{$F[0]}++<1' file.txt
word1 abca
word2 abca
word3 abbb