我想通过复制多个文本文件中的一列并将文件名附加到新文件的第一行来组织我的数据集。这是我的数据示例
文件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
并打印以1st
1 to 开头的每第四列output1
,以2nd
1 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"
}'