我有 20 个具有行和列的 Excel 文件6x6
,其中第一行和第一列是字符串标题。这些文件中的每一个都有 4 个相同的列和行标题,除了 1 个不同之外。我想知道如何修改它们,以便每个文件中具有相同标题的列和行将具有相同的顺序,而不同的行和列将始终是最后一个。
例如:
如果a.csv
看起来像这样:
a b d c x
a 1 2 3 5 3
b 2 2 5 5 2
d 2 3 4 4 6
c 5 5 6 6 5
x 3 1 6 7 9
看起来b.csv
像这样:
d c b a y
d 2 3 6 5 3
c 5 2 6 6 5
b 6 4 2 3 4
a 6 4 4 6 2
y 5 3 6 7 9
看起来c.csv
像这样:
a c d b z
a 3 3 5 5 2
c 5 4 6 6 1
d 7 4 5 7 2
b 3 2 6 6 7
z 5 3 6 4 7
等等......对于所有 20 个文件
这就是我希望它们看起来的样子:
a.csv
:
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
b.csv
:
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
与 c.csv 和其余 Excel 文件相同。
答案1
对于每次调用的任何固定顺序(在您的示例中为 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
注意:由于上述ENDFILE
情况,此代码假定 GNU awk 的最新版本 (4.x)。 (如果不可用,则需要调整解决方案。)
注 2:如果您想单独处理文件(每次awk
调用一个数据文件),您可以替换ENDFILE
为END
(也将在旧awk
版本中运行)。
您的样本数据的结果是:
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