Вопрос по awk, file, compare, field – awk сравнивает 2 файла, 2 поля различного порядка в файле, выводит на печать или объединяет и не совпадает строки

0

У меня есть два файла, и мне нужно сравнить второе поле из File1 и первое поле из File2. Если есть совпадение, чтобы напечатать второе поле File2, и вся строка совпадает с File1. Если нет совпадения, чтобы напечатать "НЕ НАЙДЕНО" и вся строка из файла1

File1

\\FILESERV04\PCO;S:\CA\USII ECOM;/FS7_434D/FILESERV04/BUSII;;;;\\FILESERV04\PCO\;467,390,611 Bytes;11,225 ;157 
\\FILESERV12\MINE$;S:\CA\Naka;/FS3_434D/FILESERV12/NAKA;;;;\\FILESERV12\MINE$\;0 Bytes;0 ;0 
\\FILESERV12\INTEG$;S:\CA\PLOTA;/FS3_434D/FILESERV12/INTEG;;;;\\FILESERV12\INTEG$\;231,094,432,158 Bytes;175,180 ;21,309 
\\FILESERV15\ED$;S:\CA\ED;/FS3_434D/FILESERV12/ED;;;;\\FILESERV15\ED$\;244,594,432,158 Bytes;145,040 ;21,311

File2

S:\CA\USII ECOM;782
S:\CA\PLOTA;0
S:\CA\Naka;781

Желаемый результат:

782;\\FILESERV04\PCO;S:\CA\USII ECOM;/FS7_434D/FILESERV04/BUSII;;;;\\FILESERV04\PCO\;467,390,611 Bytes;11,225 ;157 
781;\\FILESERV12\MINE$;S:\CA\Naka;/FS3_434D/FILESERV12/NAKA;;;;\\FILESERV12\MINE$\;0 Bytes;0 ;0 
0;\\FILESERV12\INTEG$;S:\CA\PLOTA;/FS3_434D/FILESERV12/INTEG;;;;\\FILESERV12\INTEG$\;231,094,432,158 Bytes;175,180 ;21,309 
NOT FOUND;\\FILESERV15\ED$;S:\CA\ED;/FS3_434D/FILESERV12/ED;;;;\\FILESERV15\ED$\;244,594,432,158 Bytes;145,040 ;21,311

Если номер поля для сравнения совпадает с номером поля в обоих файлах, эта строка работает:

awk -F";" 'NR==FNR{a[$1]=$2;next}{if (a[$1])print a[$1]";"$0;else print "Not Found"";" $0;}' File1 File2

Но здесь не работает, потому что в этом случае у меня есть другой номер поля для сравнения из обоих файлов.

Спасибо

Ваш Ответ

2   ответа
2
 awk -F";" 'NR==FNR{a[$1]=$2;next}{if ($2 in a)print a[$2]";"$0;else print "Not Found"";" $0;}'  File2 File1
Опять спасибо, работает отлично Eduardo
4

Один из способов использования:GNU awk

awk 'BEGIN { OFS=FS=";" } FNR==NR { array[$1]=$2; next } { print ($2 in array ? array[$2] : "Not Found"), $0 }' File2 File1

Результаты:

782;\\FILESERV04\PCO;S:\CA\USII ECOM;/FS7_434D/FILESERV04/BUSII;;;;\\FILESERV04\PCO\;467,390,611 Bytes;11,225 ;157 
781;\\FILESERV12\MINE$;S:\CA\Naka;/FS3_434D/FILESERV12/NAKA;;;;\\FILESERV12\MINE$\;0 Bytes;0 ;0 
0;\\FILESERV12\INTEG$;S:\CA\PLOTA;/FS3_434D/FILESERV12/INTEG;;;;\\FILESERV12\INTEG$\;231,094,432,158 Bytes;175,180 ;21,309 
Not Found;\\FILESERV15\ED$;S:\CA\ED;/FS3_434D/FILESERV12/ED;;;;\\FILESERV15\ED$\;244,594,432,158 Bytes;145,040 ;21,311
Спасибо @steve тоже отлично работает Eduardo
@steve: Вы также можете удалить явную FS и лишние части печати и заставить ее печатать ($ 2 в массиве? array [$ 2]: "Не обнаружена"), $ 0. Вы'd нужно FS = OFS = ";" в НАЧАЛЕ вместо -F ";" за это, но этовероятно, уместно. В противном случае: print ($ 2 в массиве? Array [$ 2]: "Не обнаружена") FS $ 0 Ed Morton
@ Edmorton: Спасибо, Эд, тыверно. Steve
почему вы явно печатаете ОРС?print было бы проще glenn jackman
@glennjackman: Спасибо, приятель. Пропустил тот. Steve

Похожие вопросы