Unix的uniq、sort和cut命令可以去除重复行

3
如果我们有如下结果:
Operating System,50
Operating System,40
Operating System,30
Operating System,23
Data Structure,87
Data Structure,21
Data Structure,17
Data Structure,8
Data Structure,3
Crypo,33
Crypo,31
C++,65
C Language,39
C Language,19
C Language,4
Java 1.6,16
Java 1.6,11
Java 1.6,10
Java 1.6,2

我只想比较第一个字段(书名),并删除每本书的除了第一行最大数的重复行。所以结果如下:

Operating System,50
Data Structure,87
Crypo,33
C++, 65
C Language,39
Java 1.6,16

有人能帮我解决一下如何使用uniq、sort和cut命令吗?也许可以使用tr、head或tail命令吗?


像 sort -u -t,-k2nr 一样,但它不起作用。 - eleven
4个回答

2
在这种情况下最优雅的方式似乎是:
rev input | uniq -f1 | rev

0
awk -F, '{if(P!=$1)print;p=$1}' your_file

0
如果您的输入已排序,您可以像这样使用GNU awk
awk -F, '!array[$1]++' file.txt

结果:

Operating System,50
Data Structure,87
Crypo,33
C++,65
C Language,39
Java 1.6,16

如果您的输入未排序,您可以像这样使用GNU awk
awk -F, 'FNR==NR { if ($2 > array[$1]) array[$1]=$2; next } !dup[$1]++ { if ($1 in array) print $1 FS array[$1] }' file.txt{,}

结果:

Operating System,50
Data Structure,87
Crypo,33
C++,65
C Language,39
Java 1.6,16

0

这可以用不同的方法来完成,但我尽量限制自己使用你建议的工具:

cut -d, -f1 file | uniq | xargs -I{} grep -m 1 "{}" file

或者,如果您确定第一列中的单词没有超过2个相同的字符,您可以简单地使用:uniq -w3 file。这告诉uniq仅比较前三个字符。


不,如果没有 xargs 是不可能的。你需要一些方法来重复调用 grep。另一个选择是使用循环。 - dogbane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接