Удалить все строки, которые содержат повторяющиеся записи в столбце 2 - PullRequest
4 голосов
/ 05 июля 2019

У меня большой файл из двух столбцов, и я хочу удалить строку на основе повторяющихся записей в столбце 2. Я хочу удалить обе дублирующие записи.

Я пытался:

awk '!seen[$2]++' filename

Но он удаляет только один дубликат.

Пример входного файла:

1  3
2  3
4  10
1  6
5  3

Ожидаемый результат:

4  10
1  6

Ответы [ 4 ]

3 голосов
/ 05 июля 2019

Не могли бы вы попробовать следующее.

awk '{seen[$2]++;value[$2]=$0} END{for(i in seen){if(seen[i]==1){print value[i]}}}' Input_file
2 голосов
/ 05 июля 2019
$ awk 'NR==FNR{cnt[$2]++; next} cnt[$2]==1' file file
4  10
1  6

или если вы не можете прочитать входные данные дважды (например, если они поступают из канала), то:

$ awk '{rec[NR]=$0; key[NR]=$2; cnt[$2]++} END{for (i=1; i<=NR; i++) if (cnt[key[i]] == 1) print rec[i]}' file
4  10
1  6
0 голосов
/ 16 июля 2019

Другой с sort, uniq и grep:

$ grep -v -f <(sort -k2n file | uniq -f 1 -D) file
4  10
1  6

Объяснено: sort сортирует file во втором поле:

1  3
2  3
5  3
1  6
4  10

uniq -f 1 -D пропускает первое ( пробег пробелов разделенное) поле и печатает только дублированные строки:

1  3
2  3
5  3

Этот список является списком исключений для grep.

0 голосов
/ 05 июля 2019

С coreutils и grep:

# Sort on the second column
<infile sort -k2,2n | 

# Count number of repeated fields in the second column
uniq -f1 -c         | 

# Remove fields that are repeated
grep -E '^ +1 +'    | 

# Squeeze white-space
tr -s ' '           | 

# Remove repeat count
cut -d' ' -f3-

Выход:

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