Bash - можно ли использовать -uniq только для одного столбца строки?

    1.gui  Qxx  16
    2.gu   Qxy  23
    3.guT  QWS  18
    4.gui  Qxr  21

я хочу отсортировать файл в зависимости от значения в 3-м столбце, поэтому я использую:

sort -rnk3 myfile

2.gu   Qxy  23
4.gui  Qxr  21
3.guT  QWS  18
1.gui  Qxx  16

теперь я должен вывести как: (строка, начинающаяся с 3.gui, отсутствует, потому что строка с 4.gui имеет большее значение)

2.gu   Qxy  23
4.gui  Qxr  21
1.guT  QWS  18

я не могу использовать -head, потому что у меня миллионы строк, и я не знаю, где резать, я не мог понять, как использовать -uniq, потому что он обрабатывает строку как единое целое, и поскольку я не могу сказать -uniq посмотреть на первый столбец, он считается строка, которая имеет уникальный вывод, - это нормально. я знаю, что -uniq может игнорировать ряд символов, но, как вы можете видеть из примера, в первом столбце может быть разное количество символов.

пожалуйста посоветуй..


person teutara    schedule 27.11.2012    source источник


Ответы (3)


Попробуй это:

sort -rnk3 myfile | awk -F"[. ]" '!a[$2]++'

awk удаляет дубликаты в зависимости от 2-го столбца. На самом деле это известный синтаксис awk для удаления дубликатов. Массив поддерживается там, где сохраняется запись 2-го поля. Каждый раз перед печатью записи в массиве проверяется 2-е поле. Если он отсутствует, он печатается, в противном случае он отбрасывается, поскольку он является дубликатом. Это достигается с помощью ++. В первый раз, когда встречается запись, этот ++ будет держать счетчик равным 0 с момента его постфикса. Последующие вхождения будут увеличивать значение, которое при отрицании становится ложным.

person Guru    schedule 27.11.2012
comment
2-й столбец, потому что мы разбиваем файл с расширением . и пробел в качестве разделителя, и, следовательно, 2-й столбец даст нам графический интерфейс и т. д. - person Guru; 27.11.2012

Ну вот:

sort -rnk3 file | awk -F'[. ]' '{ if (a[$2]++ == 0) print }' 

2.gu   Qxy  23
4.gui  Qxr  21
1.guT  QWS  18

Это использует awk для проверки повторяющихся значений во втором поле, где разделителем полей является либо пробел, либо точка. Так вот что он рассматривает второе поле как:

$ awk -F'[. ]' '{ print $2 }' file

gu
gui
guT
gui

В awk переменная $0 представляет всю строку, $1 представляет первое поле и так далее.

awk -F'[. ]' '{ if (a[$2]++ == 0) print }' опции -F позволяют указать разделитель полей, в данном случае это либо пробел, либо точка.

person Chris Seymour    schedule 27.11.2012
comment
эй @sudo_O ..еще раз спасибо. не могли бы вы немного объяснить команду -awk? - person teutara; 27.11.2012

Итак, я нашел это всемогущим и удивительным Google - мой маленький скрипт основан на ответе @sudo_O, поскольку он показывает вам все найденные повторяющиеся строки ...., а не файл без дубликатов.

Текст, который я нашел, все дубликаты в 3-м столбце (порт) были в файле с именем master.txt.

awk '{if (a[$3]++ > 0) print}' master.txt | while read site thread port
do
  grep $port master.txt
done
person Ziferius    schedule 21.06.2013