复制列并将文件名作为列标题

复制列并将文件名作为列标题

我想通过复制多个文本文件中的一列并将文件名附加到新文件的第一行来组织我的数据集。这是我的数据示例

文件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

我能够使用以下命令复制并组织到四个所需的文件中

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

括号中的命令在作为输入传递之前在它们自己的子 shell 中执行paste

答案3

我会做这样的整个事情:
使用printf+cut打印标题、paste文件内容并连接cat两个结果,然后通过管道将其传输到awk并打印以1st1 to 开头的每第四列output1,以2nd1 to开头的每第四列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"
}'

相关内容