использовать команды Unix для фильтрации и сортировки данных - PullRequest
1 голос
/ 12 ноября 2010

Допустим, у меня есть данные, как показано ниже:

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 ]

3 голосов
/ 12 ноября 2010

Это берет ваш ввод и дает ваш вывод.Я не уверен, что это то, что вы хотите, учитывая неопределенность вашей спецификации ...

$ 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 в командной строке.

0 голосов
/ 12 ноября 2010

Не очень понятно, что вы хотите сделать.

Я предполагаю, что вы хотите напечатать только уникальные значения в столбце 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
$ 
0 голосов
/ 12 ноября 2010

Если данные находятся в data.txt, используйте:

sort < data.txt > sorted.txt

Если вы хотите просто m9, используйте:

grep m9 < data.txt | sort | uniq > sorted_m9.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...