切换 .csv 文件中的列,使它们全部相同

切换 .csv 文件中的列,使它们全部相同

我有 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调用一个数据文件),您可以替换ENDFILEEND(也将在旧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

相关内容