Попробуйте:
awk '{c[$NF+0]++; a[NR]=$NF+0; b[NR]=$0} END{for(i=1;i<=NR;i++)if(c[a[i]]>1)print b[i]}' file
Использование входного файла:
$ cat file
I love my country 1234
I love Newyork 5678
I love my city 1234
I love my pet 1111
I love my dog 2222
I love my cat 1111
I love my cat 5555
Приведенная выше команда выдает:
$ awk '{c[$NF+0]++; a[NR]=$NF+0; b[NR]=$0} END{for(i=1;i<=NR;i++)if(c[a[i]]>1)print b[i]}' file
I love my country 1234
I love my city 1234
I love my pet 1111
I love my cat 1111
Для тех, кто предпочитает, чтобы их команды располагались на нескольких строках:
awk '
{
c[$NF+0]++
a[NR]=$NF+0
b[NR]=$0
}
END{
for(i=1; i<=NR; i++)
if (c[a[i]]>1)
print b[i]
}
' file
c[$NF+0]++
Массив c
теперь отслеживает, сколько раз число в последнем поле каждой строки появлялось в файле.
a[NR]=$NF+0
Массив a
хранит число в последнем поле строки под ключом номера строки, NR
.
b[NR]=$0
Для строки с номером NR
массив b
хранит строку.
END{for(i=1;i<=NR;i++)if(c[a[i]]>1)print b[i]}
После того, как мы достигнем конца файла, эта функция снова перебирает каждую строку и печатает ее, если число в c
для числа в этой строке, как указано в a
, больше 1.