Удалите дублирующиеся строки на основе двух столбцов с помощью Awk - PullRequest
0 голосов
/ 10 сентября 2018

Учитывая этот вход:

#       133        15
KBL  40.385  26.385 1.0000 S
KBL  23.846   9.289 1.0000 P
KBL  40.234  26.385 1.0000 S
#       133         4
KBL  40.234  28.566 1.0000 S
KBL  40.385  28.566 1.0000 S
KBL  23.846  12.032 1.0000 P

Я хочу удалить повторяющиеся строки, особенно если значение в столбце 2 или 3 повторяется. Другими словами, я хочу получить этот вывод:

#       133        15
KBL  40.385  26.385 1.0000 S
KBL  23.846   9.289 1.0000 P
#       133         4
KBL  40.234  28.566 1.0000 S
KBL  23.846  12.032 1.0000 P

Я пытался awk '!a[$0]++' file.xy. Однако это удаляет только те строки, которые полностью идентичны. Я пытаюсь удалить только строки с повторяющимися значениями в столбцах два или три.

С помощью Awk, как лучше всего удалить эти дублирующиеся строки? Благодаря.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Это даст вам требуемый вывод. Для этого метода нам нужны два файла:

awk '!a[$2]++ || !a[$3]++' file1.txt > file2.txt && awk '!a[$3]++' file2.txt

Полученная продукция:

#       133        15
KBL  40.385  26.385 1.0000 S
KBL  23.846   9.289 1.0000 P
#       133         4
KBL  40.234  28.566 1.0000 S
KBL  23.846  12.032 1.0000 P
0 голосов
/ 10 сентября 2018

Предполагая, что вы хотите, чтобы строки, начинающиеся с # напечатанные, не хотели, чтобы их значения в $ 2 или $ 3 учитывались в тестах на наличие дублирующихся значений, и хотите исключить дубликаты только в каждом из отдельных # -линейных блоков:

$ awk '/^#/{print; delete seen; next} !(seen[$2]++ || seen[$3]++)' file
#       133        15
KBL  40.385  26.385 1.0000 S
KBL  23.846   9.289 1.0000 P
#       133         4
KBL  40.234  28.566 1.0000 S
KBL  23.846  12.032 1.0000 P
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...