Более общий подход к сравнению любого количества несортированных файлов с использованием GNU awk для массивов массивов и ARGIND:
$ cat tst.awk
BEGIN { OFS="\t" }
{ cnt[$0][ARGIND]++ }
END {
for (str in cnt) {
for (fileNr=1; fileNr<=ARGIND; fileNr++) {
printf "%d%s", cnt[str][fileNr], OFS
}
print str
}
}
$ awk -f tst.awk a b
1 2 1111|100|11/11/1111|a
1 1 2222|200|11/11/1111|a
1 1 3333|300|11/11/1111|a
1 0 4444|400|11/11/1111|a
0 1 5555|500|11/11/1111|a
Вышеприведенное показывает каждую уникальную строку во всех файлах вместе с тем, сколько раз данная строка появляется в первом файле, сколько раз во втором и т. д.
Чтобы получить желаемый результат, можно просто:
$ awk -f tst.awk a b | awk '$2>$1' | cut -f3-
1111|100|11/11/1111|a
5555|500|11/11/1111|a
grep
здесь не подходит, так как он используется для извлечения отдельных строк, соответствующих некоторой форме регулярного выражения (, а не для сравнения файлов на самом деле ). Он не сможет вернуть одно совпадение и отбросить другое (первые две строки вашего файлаb
).
Вы можете использоватьcomm
:
$ comm -13 a b
1111|100|11/11/1111|a
5555|500|11/11/1111|a
Обратите внимание, что comm
зависит от отсортированных входных данных.
Приведенная выше команда comm
использует -13
для отбрасывания первого и третьего столбцов в выходных данных по умолчанию. По умолчанию он выводит строки, найденные только в первом файле в столбце 1, строки, найденные только во втором файле в столбце 2, и общую строку в последнем столбце (. См. руководство для comm
в вашей системе. стандартная утилита):
$ comm a b
1111|100|11/11/1111|a
1111|100|11/11/1111|a
2222|200|11/11/1111|a
3333|300|11/11/1111|a
4444|400|11/11/1111|a
5555|500|11/11/1111|a