使用unix命令过滤和排序数据

时间:2010-11-12 06:03:50

标签: unix awk

假设我的数据如下:

aaa m7
aaa m9
aaa m7
aaa m7
aaa m7
ccc m9
ccc m7
ccc m7
bbb m7
bbb m9
bbb m7
ddd m7

我怎么能把它分成:

aaa m9
bbb m9
ccc m9
ddd m7

使用unix命令(sort,uniq等)?

我需要的是对所有数据进行排序,然后过滤掉具有相同字段#1的所有数据。

3 个答案:

答案 0 :(得分:3)

这会获取您的输入并提供输出。鉴于你的规范含糊不清,我不确定这是否是你想要的......

$ cat ./4162059.awk 
#!/usr/bin/awk -f

{
    if (d[$1] < $2) {
        d[$1] = $2
    }
}

END {
    for (k in d) {
       print k " " d[k]
    }
}

$ cat ./4162059.txt 
aaa m7
aaa m9
aaa m7
aaa m7
aaa m7
ccc m9
ccc m7
ccc m7
bbb m7
bbb m9
bbb m7
ddd m7

$ ./4162059.awk 4162059.txt | sort
aaa m9
bbb m9
ccc m9
ddd m7

awk程序记录第1列的值为第2列的“最高”值,并在解析整个输入文件后打印它们。然后在命令行上按sort对输出进行排序。

答案 1 :(得分:0)

如果数据位于data.txt中,请使用:

sort < data.txt > sorted.txt

如果您只想要m9,请使用:

grep m9 < data.txt | sort | uniq > sorted_m9.txt

答案 2 :(得分:0)

目前还不是很清楚你想做什么。

我假设您只想在第1列中打印具有第2列中最大对应值的唯一值,因为您的输出具有m9

sort -V input | 
perl -nae '$H{$F[0]}=$F[1];END{for(sort keys %H){print $_." ".$H{$_}."\n";}}'

示例运行:

$ cat file
aaa m9
aaa m10
ccc m9
ccc m7
bbb m7
bbb m9
bbb m7
ddd m11
ddd m1
$ sort -V file | perl -nae '$H{$F[0]} = $F[1];END{for(sort keys %H){print $_." ".$H{$_}."\n";}}'
aaa m10
bbb m9
ccc m9
ddd m11
$