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

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

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

ファイル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

答え2

ファイルをエコーし​​、awk処理されたデータを使用してください。

paste <( echo file1 ; awk '{print $1}' file1 )\
      <( echo file2 ; awk '{print $1}' file2 ) #and so on

括弧内のコマンドは、入力に渡される前に独自のサブシェルで実行されます。paste

答え3

私は次のようにすべてを行います。 +を
使用してヘッダー、ファイルの内容を印刷し、2つの結果を連結し、パイプを使用して1から始まる4列目、1から始まる4列目に印刷します。printfcutpastecatawk1stoutput12ndoutput2

for f in file*
do
printf " ${f}%.0s" 1 2 3 4
done | cut -c2- | cat - <(paste file*) | awk '{
for (i=1;i<=NF;i+=4){printf "%s ",$i >"output1"} ;print "" >"output1"
for (i=2;i<=NF;i+=4){printf "%s ",$i >"output2"} ;print "" >"output2"
for (i=3;i<=NF;i+=4){printf "%s ",$i >"output3"} ;print "" >"output3"
for (i=4;i<=NF;i+=4){printf "%s ",$i >"output4"} ;print "" >"output4"
}'

関連情報