Любой приличный редактор может удобно выделять диффы. Как правило, редактор можно убедить, используя расширение .diff
или установив для типа файла значение diff
в противном случае.
Для любого фиксированного упорядочивания вызовов (a, b, c, d в вашем примере) вы можете использовать, например, программу awk
, подобную этой, чтобы выполнить задача:
awk -v order=',a,b,c,d' '
BEGIN {
OFS = FS = "\t"
n = split(order,ord,",")
for (i=1; i<=n; i++) ind[ord[i]] = i
}
FNR==1 {
for (i=2; i<=n; i++) prm[ind[$i]] = i
}
{
out[$1] = sprintf("%s", $1)
for (i=2; i<=n; i++) {
out[$1] = out[$1] sprintf("%s%s", OFS, $prm[i])
}
out[$1] = out[$1] sprintf("%s%s", OFS, $NF)
}
ENDFILE {
for (i=1; i<=n; i++) print out[ord[i]]
print out[$1] ORS
}
' a.csv b.csv c.csv
Примечание. Этот код предполагает наличие последней версии (4.x) GNU awk из-за условия ENDFILE
. (Если это недоступно, решение требует корректировки.)
Примечание 2: Если вы хотите обрабатывать файлы индивидуально (один файл данных на вызов awk
), вы можете заменить ENDFILE
] от END
(который также будет работать в более старых awk
s).
Результаты для ваших образцов данных:
a b c d x
a 1 2 5 3 3
b 2 2 5 5 2
c 5 5 6 6 5
d 2 3 4 4 6
x 3 1 7 6 9
a b c d y
a 6 4 4 6 2
b 3 2 4 6 4
c 6 6 2 5 5
d 5 6 3 2 3
y 7 6 3 5 9
a b c d z
a 3 5 3 5 2
b 3 6 2 6 7
c 5 6 4 6 1
d 7 7 4 5 2
z 5 4 3 6 7