AWK: удалить все строки, когда столбцы 1 и 2 совпадают - PullRequest
0 голосов
/ 17 мая 2018

Я хотел бы не только удалить дубликаты, но и строку, которая проверяется при обнаружении дубликата.

Существующий код

awk '!a[$1$2]++'

Вход

HNSONV  LSVRNV  10  srlg-value  52000
HNSONV  PHNAAZ  0   srlg-value  53000
HRHNLA  PNSCFL  0   srlg-value  54000
HRHNLA  PNSCFL  10  srlg-value  55000
HRHNLA  PNSCFL  20  srlg-value  54500
HRHNLA  PNSCFL  30  srlg-value  55500
JHSNAR  KSCYMO  0   srlg-value  56000
JHSNAR  OKCYOK  0   srlg-value  57000

Выход

HNSONV  LSVRNV  10  srlg-value  52000
HNSONV  PHNAAZ  0   srlg-value  53000
JHSNAR  KSCYMO  0   srlg-value  56000
JHSNAR  OKCYOK  0   srlg-value  57000

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

при условии, что первые два поля всегда имеют длину 14 символов, а дубликаты расположены рядом друг с другом, как и в данном примере (при необходимости сортируйте входные данные):

$ uniq -w14 -u ip.txt
HNSONV  LSVRNV  10  srlg-value  52000
HNSONV  PHNAAZ  0   srlg-value  53000
JHSNAR  KSCYMO  0   srlg-value  56000
JHSNAR  OKCYOK  0   srlg-value  57000

С man uniq

uniq - сообщать или опускать повторяющиеся строки

-u, --unique печатать только уникальные строки

-w, --check-chars = N сравнивать не болеечем N символов в строках

0 голосов
/ 17 мая 2018

двухпроходный алгоритм

$ awk 'NR==FNR{a[$1,$2]++; next} a[$1,$2]==1' file{,}

HNSONV  LSVRNV  10  srlg-value  52000
HNSONV  PHNAAZ  0   srlg-value  53000
JHSNAR  KSCYMO  0   srlg-value  56000
JHSNAR  OKCYOK  0   srlg-value  57000

обратите внимание на , в ключах массива для предотвращения ложноположительных совпадений из-за конкатенации двух строк (например, «AB A» и «A BA» приведут к тому же ключу в вашей версии).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...