列をコピーし、ファイル名を列ヘッダーとして使用する

列をコピーし、ファイル名を列ヘッダーとして使用する

複数のテキストファイルの列をコピーし、新しいファイルの最初の行にファイル名を追加してデータセットを構成したいと思います。私のデータの例は次のとおりです。

ファイル1

a   a   b   b
1   2   3   4

ファイル2

c   d   e   f
g   h   i   g

。 。 。

ファイル3

11  12  23  12
2   4   6   7

フェロン

n1  n2  n3  n4
nn  nm  no  np

私が望む出力は、データファイルからその列を収集して4つのデータファイルを生成することです。

出力1

file1   file2   file3   filen
a   c   11  n1
1   g   2   nn

出力2

file1   file2   file3   filen
a   d   12  n2
2   h   4   nm

出力3

file1   file2   file3   filen
b   e   23  n3
3   i   6   no

出力4

file1   file2   file3   filen
b   f   12  n4
4   g   7   np

以下を使用して、4つの必須ファイルをコピーして整理することができました。

awk 'FNR==1{f++}{a[f,FNR]=$1}END{for(x=1;x<=FNR;x++){for(y=1;y<ARGC;y++)printf("%s ",a[y,x]);print ""}}' file* > output1
awk 'FNR==1{f++}{a[f,FNR]=$2}END{for(x=1;x<=FNR;x++){for(y=1;y<ARGC;y++)printf("%s ",a[y,x]);print ""}}' file* > output2
awk 'FNR==1{f++}{a[f,FNR]=$3}END{for(x=1;x<=FNR;x++){for(y=1;y<ARGC;y++)printf("%s ",a[y,x]);print ""}}' file* > output3
awk 'FNR==1{f++}{a[f,FNR]=$4}END{for(x=1;x<=FNR;x++){for(y=1;y<ARGC;y++)printf("%s ",a[y,x]);print ""}}' file* > output4

ただし、出力ファイルの最初の行にファイル名を追加することはできません。

どんな助けでも大変感謝します。

ベストアンサー1

すでに出力ファイルがあり、各ファイルにファイル名を含むヘッダーを追加する必要がある場合は、次のようにします。

header=$(printf "%s %s %s %s\n" $(awk 'FNR==1{print FILENAME}' file*))
for file in output*; do 
    printf '%s\n%s\n' "$header" "$(cat $file)" > tmp && 
    mv tmp "$file"; 
done

おすすめ記事