Я думаю, что теперь разобрался со следующим, на случай, если кто-то еще прочитает это и ему понадобится это. Спасибо еще раз.
FNR == NR {
for (i = 2; i <= NF; i++) { a[i,$1] = $i }
b[$1];
next;
}
($1 in b) { # check if row in file2 existed in file1
for (i = 2; i <= NF; i++) {
if (a[i,$1] == $i)
printf("%s->col%d: %s vs %s: Valid\n", $1, i-1, a[i,$1], $i);
else
printf("%s->col%d: %s vs %s: Failure\n", $1, i-1, a[i,$1], $i);
}
delete b[$1]; # delete entries which are processed
}
END {
for (left in b) { # look which didn't match
for (i = 2; i <= NF; i++)
printf("%s->col%d: %s vs (blank): Not Equal\n", left, i-1, a[i,left])
}
}
Расширение ответа Gilles:
parallel 'head -n "$(cat {1})" {2}' ::: File1s* :::+ Corresponding_File2s*
Вероятно, у вас много файлов File1, которые вы хотите связать с файлами File2. Функция :::+ делает это.
Используйте подстановку команды.
head -n "$(cat File1)" File2
Подстановка команды вводит вывод команды в командную строку. Новые строки в конце вывода удаляются, а это именно то, что вам здесь нужно.
Альтернативно, в bash (но не в других вариантах sh), вы можете использовать mapfile
встроенный модуль для загрузки файла построчно.
mapfile lines <File1
head -n "${lines[0]}" File2
Строки загружаются в массив, поэтому номер строки n будет ${lines[n]}
. Для первой строки bash также позволяет написать $line
.