行と列を含む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
ができます(以前のバージョンでも機能します)。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