複数のテキストファイルの列をコピーし、新しいファイルの最初の行にファイル名を追加してデータセットを構成したいと思います。私のデータの例は次のとおりです。
ファイル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列目に印刷します。printf
cut
paste
cat
awk
1st
output1
2nd
output2
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"
}'