.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:ファイルを個別に処理するには(呼び出しごとに1つのデータファイル)、次のように置き換えることawkができます(以前のバージョンでも機能します)。ENDFILEENDawk

サンプルデータの結果は次のとおりです。

    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

おすすめ記事