awk 'FNR==NR{a[$1]++;next}(a[$1] > 1)' ./infile ./infile
Да, вы даете ему тот же файл, что и ввод дважды. Поскольку вы не знаете заранее, является ли текущая запись уникальной или нет, вы строите массив на основе $1
при первом проходе, тогда вы выводите только те записи, которые видели $1
более одного раза на втором проходе. .
Я уверен, что есть способы сделать это только с одним проходом через файл, но я сомневаюсь, что они будут такими же "чистыми"
Объяснение
FNR==NR
: Это верно только тогда, когда awk
читает первый файл. По сути, он проверяет общее количество просмотренных записей (NR) по сравнению с входной записью в текущем файле (FNR).
a[$1]++
: создание ассоциативного массива a , ключ которого является первым полем ($1
), а значение которого увеличивается на единицу каждый раз, когда его видят.
next
: игнорировать оставшуюся часть сценария, если это будет достигнуто, начать заново с новой входной записи
(a[$1] > 1)
Это будет оцениваться только на втором проходе ./infile
и печатать только те записи, кто первое поле ($1
) мы видели не раз. По сути, это сокращение для if(a[$1] > 1){print $0}
Подтверждение концепции
$ cat ./infile
1 abcd
1 efgh
2 ijkl
3 mnop
4 qrst
4 uvwx
$ awk 'FNR==NR{a[$1]++;next}(a[$1] > 1)' ./infile ./infile
1 abcd
1 efgh
4 qrst
4 uvwx