Как найти строки с одинаковыми двумя полями и удалить все эти строки, кроме одной [дубликат]

-1
05.07.2017, 07:21
1 ответ

GNU AWK

Вот тестовый прогон со слегка измененным входным файлом:

bash-4.3$ $ awk '{v=sprintf("%s_%s",$1,$NF); if ( ! a[v]) print;   a[v]++;   }' input.txt 
bash: $: command not found
bash-4.3$ awk '{v=sprintf("%s_%s",$1,$NF); if ( ! a[v]) print;   a[v]++;   }' input.txt 
AAAAA stuff in between BBBBB
AA stuff AAABBBBB
AAAAA more stuff in the middle CCCCCC

bash-4.3$ cat input.txt
AAAAA stuff in between BBBBB
AA stuff AAABBBBB
AAAAA more stuff in the middle CCCCCC
AAAAA even more cool stuff BBBBB
AAAAA extra line CCCCCC

Как это работает:

  • Ключевой момент :мы создаем массив пар ключей -значений и печатаем в зависимости от того, есть ли у нас уже элемент массива для этой пары значений ключа -
  • Ключ
  • строится с помощью v=sprintf("%s_%s",$1,$NF), где $NF— последнее поле в строке; например, для строк 1 и 3 ключ будет AAAAABBBBB. Значение — это целое число, которое увеличивается каждый раз, когда мы находим совпадение.
  • Переменная
  • vи соответствующая проверка if (!a[v]) printвыполняются для каждой строки, печать выполняется только в том случае, если значение не найдено в массиве.
  • a[v]++выполняется в каждой строке независимо от того, печатали мы или нет

Как указал Сандип в комментариях, этот же подход можно упростить до:

bash-4.3$ awk '!seen[$1"_"$NF]++' input.txt
AAAAA stuff in between BBBBB
AA stuff AAABBBBB
AAAAA more stuff in the middle CCCCCC
0
28.01.2020, 05:12

Теги

Похожие вопросы