Сравнение файлов с awk

Привет у меня есть два похожих файла (оба с 3 столбцами). Я хотел бы проверить, содержат ли эти два файла одни и те же элементы (но перечислены в разных порядках). Прежде всего я хотел бы сравнить только 1-й колонны

file1.txt

"aba" 0 0 
"abc" 0 1
"abd" 1 1 
"xxx" 0 0

file2.txt

"xyz" 0 0
"aba" 0 0
"xxx" 0 0
"abc" 1 1

Как я могу это сделать с помощью awk? Я попытался осмотреться, но нашел только сложные примеры. Что делать, если я хочу включить также два других столбца в сравнение? Выход должен дайте мне количество совпадающих элементов.

2 ответов


для печати общие элементов в обоих файлах:

$ awk 'NR==FNR{a[];next} in a{print }' file1 file2
"aba"
"abc"
"xxx"

объяснение:

NR и FNR are awk переменные, которые хранят общее количество записей и количество записей в текущем файлы соответственно (по умолчанию-строка).

NR==FNR # Only true when in the first file 
{
    a[] # Build associative array on the first column of the file
    next  # Skip all proceeding blocks and process next line
}
( in a) # Check in the value in column one of the second files is in the array
{
    # If so print it
    print 
}

если вы хотите соответствовать целым строкам, используйте :

$ awk 'NR==FNR{a[];next} in a{print }' file1 file2
"aba" 0 0
"xxx" 0 0

или определенный набор столбцов:

$ awk 'NR==FNR{a[,,];next}(,,) in a{print ,,}' file1 file2
"aba" 0 0
"xxx" 0 0

чтобы напечатать количество совпадающих элементов, вот один из способов использования awk:

awk 'FNR==NR { a[]; next }  in a { c++ } END { print c }' file1.txt file2.txt

результаты с помощью ввода:

3

если вы хотите добавить дополнительные столбцы (например, столбцы один, два и три), используйте псевдо-многомерный массив:

awk 'FNR==NR { a[,,]; next } (,,) in a { c++ } END { print c }' file1.txt file2.txt

результаты с помощью ввода:

2