Unix - Требуются записи из файла 2, которых нет в файле 1, путем сопоставления первых 91 символов

Я хочу сравнить file2 с file1, сопоставив первые 91 символ каждого файла и вывести полную запись из file2 в file3. Я новичок в командах Unix и просто не могу понять это.

Заранее спасибо, Джефф

2 ответа

Решение

Я сгенерировал фиктивные файлы следующим образом:

file1

A012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
B012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
C012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
D012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
E012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
F012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789

file2

Z012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 1
B012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 2
T012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 3
D012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 4
E012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 5
F012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 6

Тогда я думаю, что вы хотите это:

awk '
   # Processing for file1, basically create associative array entry indexed by leftmost 91 characters
   FNR==NR { f1[substr($0,1,91)]++; next }

   # Processing for second file
   f1[substr($0,1,91)] > 0

   ' file1 file2

Пример вывода

B012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 2
D012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 4
E012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 5
F012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 6

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

f1[substr($0,1,91)] > 0

к этому:

! f1[substr($0,1,91)]

Вы можете сравнить два файла, используя cmp:

$ cmp file1 file2
file1 file2 differ: byte 92, line 1

Если вы хотите сравнить только первые 91 байт, вы можете использовать -n переключатель:

$ cmp -n 91 file1 file2

Если вы хотите что-то сделать в этом случае (например, скопировать файл в другой файл), вы можете использовать bash's if:

if cmp -n 91 file1 file2; then
    cp file2 file3
fi
Другие вопросы по тегам