Сортировка в линуксе - PullRequest
       0

Сортировка в линуксе

0 голосов
/ 27 января 2012

У меня есть строка "abc", и я добавляю ее в 15 файлов в моем каталоге в оболочке.Когда я grep "abc" в моих 15 файлах, он возвращает мне целую строку файлов, в которых присутствует этот файл, как это:

abc 0.2  9.0
abc 0.01 8.0
abc 0.06 9.4
abc 0.02 8.7

Теперь я хочу, чтобы этот вывод был отсортирован в порядке возрастания поcolumn.

Итак, я написал команду так:

grep "abc" *.txt | sort -nr -t_ -k2

, но вышеприведенная команда не работает, и я не знаю почему.

Ответы [ 4 ]

3 голосов
/ 27 января 2012

Ваша команда не работает, потому что у вас нет подчеркивания, разделяющего столбцы;кроме того, вы хотели, чтобы данные были в порядке возрастания, но вы указали сортировать их в обратном (нисходящем) порядке.Используйте:

grep "abc" *.txt | sort -n -k 2

Или:

grep "abc" *.txt | sort -k 2n

Обратите внимание, что при наличии нескольких файлов ваш вывод grep будет иметь префикс с именем файла.Вам придется решить, имеет ли это значение.Это только испортит вещи, если есть пробелы в любом из имен файлов.Параметр -h для grep подавляет имена файлов.

2 голосов
/ 27 января 2012

Я предлагаю удалить параметр -t_, потому что, как я вижу, вы используете пробелы в качестве разделителя, а не подчеркивания. После этого у меня это работает:

$ cat t | sort -n -k2
abc 0.01 8.0
abc 0.02 8.7
abc 0.06 9.4
abc 0.2  9.0

Обновлено: и да, как сказал @ jonathan-leffler, вы также должны опустить -r опцию сортировки по возрастанию.

1 голос
/ 27 января 2012

Вы можете заменить весь сценарий, включая вызов grep, одним вызовом awk

awk '/abc/{a[$2,i++]=$0}END{l=asorti(a,b);for(i=1;i<=l;i++)print a[b[i]]}' *.txt

Пример

$ ls *.txt
four.txt  one.txt  three.txt  two.txt

$ cat *.txt
abc 0.02 8.3
foo
abc 0.06 9.4
bar
blah blah
abc 0.2  9.0
blah
abc 0.01 8.0
blah
abc 0.02 8.7
blah blah

$ awk '/abc/{a[$2,i++]=$0}END{l=asorti(a,b);for(i=1;i<=l;i++)print a[b[i]]}' *.txt
abc 0.01 8.0
abc 0.02 8.3
abc 0.02 8.7
abc 0.06 9.4
abc 0.2  9.0
0 голосов
/ 27 января 2012

Первая проблема: вы использовали -t_ для указания разделителя полей, но вывод не содержит _ символов.

Следующая проблема: опция -k имеет два аргумента: начальное поле и конечное поле. Опуская поле конца, вы получите end_of_line по умолчанию.

Я бы предложил написать так:

grep "abc" *.txt | sort -nr -k2,2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...