2010-11-12 5 views
1

Disons que j'ai données ci-dessous:utilisation unix commandes pour filtrer et trier les données

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

Comment pourrais-je trier dans:

aaa m9 
bbb m9 
ccc m9 
ddd m7 

en utilisant les commandes unix (tri, uniq, etc.)?

Ce dont j'ai besoin, c'est de trier toutes les données puis de filtrer toutes les données avec le même champ # 1.

+2

Apparemment filtré, pas trié. –

+0

éditer ma question, j'espère que c'est clair maintenant – user466130

+2

Qu'est-ce que tu veux faire? –

Répondre

3

Cela prend votre entrée et donne à votre sortie. Je ne sais pas que ce soit ce que vous voulez, compte tenu de l'imprécision de votre cahier des charges ...

$ 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 

Le programme awk garde note de la valeur de la colonne 1 avec la valeur plus « élevée » de la colonne 2 et impressions eux une fois qu'il a analysé l'ensemble du fichier d'entrée. La sortie est ensuite triée par sort sur la ligne de commande.

+1

Awk est sous-utilisé et idéal pour ce genre de chose. +1 –

+0

Merci @Conrad. Il est sous-utilisé par moi aussi. J'ai tendance à l'utiliser uniquement comme un hybride 'cut' +' grep' :-) – Johnsyweb

0

Si les données réside dans data.txt, utilisez:

sort <data.txt> sorted.txt 

Si vous voulez juste les années m9, utilisez:

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

Il est pas très clair ce que vous voulez faire.

Je suppose que vous voulez imprimer uniquement des valeurs uniques dans la colonne 1 avec la plus grande valeur correspondante dans la colonne 2 parce que votre sortie a m9.

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

run Exemple:

$ 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 
$ 
+0

qu'est-ce que sort -V – user466130

Questions connexes