Вот тестовый прогон со слегка измененным входным файлом:
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