Я написал этот код, но я сталкиваюсь с проблемой, как упомянуто ниже.
Мой Код:
paste 1.txt 2.txt|
awk ' { FS = "\t " } ; NR == 1 { n = NF/2 }
{for(i=1;i<=n;i++)
if($i!=$(i+n))
{c = c s i; s = "," }
if(c)
{print "Line No. " NR-1 " COLUMN NO " c;
c = "" ; s = "" } } '
Ожидаемый вывод:
Line No. 2 COLUMN NO 2,3
Line No. 4 COLUMN NO 1,2,3,4
Line No. 6 COLUMN NO 2,3,4,5
Line No. 7 COLUMN NO 1,2,3,4,5
Вывод, который становится сгенерированным:
Line No. 2 COLUMN NO 2,3
Line No. 4 COLUMN NO 1,2,3,4
Line No. 6 COLUMN NO 2,3,4,5
Line No. 7 COLUMN NO 1,2,3,4
Ниже указанного файла разделенное пространство. Для понимания этого лучше, я отформатировал его этот путь.
File1:
ID_ID First_name Last_name Address Contact_Number
ID1 John Rock 32, Park Lake, California 2222200000
ID2 Tommy Hill 5322 Otter Lane Middleberge 3333300000
ID3 Leonardo Test Half-Way Pond, Georgetown 4444400000
ID8 Rhyan Bigsh 6762,33 Ave N,St. Petersburg 5555500000
ID50 Steve Goldberg 6762,33 Ave N,St. Petersburg 6666600000
ID60 Steve Goldberg 6666600000
File2:
ID_ID First_name Last_name Address Contact_Number
ID1 John Rock 32, Park Lake, California 2222200000
ID2 Tommy1 Hill1 5322 Otter Lane Middleberge 3333300000
ID3 Leonardo Test Half-Way Pond, Georgetown 4444400000
ID80 Sylvester Stallone 5555500000
ID50 Steve Goldberg 6762,33 Ave N,St. Petersburg 6666600000
ID60 Mark Waugh St. Petersburg 7777700000
ID70 John Smith 8888800000
Вот подсказка. Вывод:
paste 1.txt 2.txt | awk '
{ FS = "\t" }
NR == 1 { n = NF/2 } {
for(i=1;i<=n;i++) print "\"" $i "\" " ($i == $(i+n) ? "==":"!=") " \"" $(i+n) "\""
print "###############"
}'
, который сравнивает и печатает каждое поле в каждой записи между файлами, заканчивается:
"ID60" == "ID60"
"Steve" != "Mark"
"Goldberg" != "Waugh"
"" != "St. Petersburg"
"6666600000" != "7777700000"
###############
"" != "8888800000"
"ID70" != ""
"John" != ""
"Smith" != ""
"" == ""
###############
существует две ошибки:
существует скрытая ошибка диапазона в случае строки, только существующей во втором файле. Это вызвано тем, что недостающая запись имеет одна поле, пустая строка перед вкладкой, добавленной paste
. Поэтому в этом случае Вы эффективно выдерживаете сравнение, поля в порядке 5,1,2,3,4.
Поле 4 пусто для этой строки в обоих файлах (хотя по-разному), таким образом, я ожидал бы вывод:
Line No. 7 COLUMN NO 1,2,3,5
Для получения точного вывода Вы хотите, сырая фиксация ниже сообщит, что все поля не соответствуют, если строка только присутствует в одном файле. Это может быть обнаружено эти NF == n+1
добавленный к эти if
, потому что должны быть только n+1
а не 2*n
поля для строки, только существующей в одном файле, какой бы ни файл, который является.
paste 1.txt 2.txt | awk '
{ FS = "\t" }
NR == 1 { n = NF/2 } {
for(i=1;i<=n;i++) if(NF == n+1 || $i!=$(i+n)) {c = c s i; s = "," }
if(c){print "Line No. " NR-1 " COLUMN NO " c; c = "" ; s = "" }
}'
Это предполагает, что все записи содержат корректное количество вкладок, n-1
.