awk:在循环中添加带有文件名的列名

awk:在循环中添加带有文件名的列名

我有一个在 awk 循环期间添加列标题的问题:我目前有这段代码,它计算每个 csv 文件每行的平均值:

for i in *.csv; do  
  awk -F"," 'NR==1 { next }
        { T=0
           for(N=1; N<=NF; N++) T+=$N;
           T/=NF
           print T }' $i > Mean$i
done

所以我得到的文件 MeanName1.csv、MeanName2.csv...包含:

2.5                3.5                ...
4.2                3.4
1.2                3.9
1.2                3.7

我想要一个包含以下内容的“Mean”文件:

Name1   Name2   ...
2.5     3.5
4.2     3.4
1.2     3.9
1.2     3.7

我未能在循环中使用 print FILENAME 。

你有什么建议吗 ?谢谢

答案1

使用 加入输出文件是最简单的paste,但我认为它不知道如何将文件名添加为标题。但我们可以手动对循环内的中间输出文件执行此操作,因此:

for i in *.csv; do
    out="Mean$i"
    echo "${i%.csv}" > "$out"
    awk -F"," 'NR==1 { next }
        { T=0
           for(N=1; N<=NF; N++) T+=$N;
           T/=NF
           print T }' "$i" >> "$out"
done
paste Mean*.csv > All.csv

${i%.csv}$i只是删除了后缀的值.csv,因此对于foo.csvbar.csv,给出如下输出:

bar     foo
4.33333 2.5
3.8     3.5

我注意到您还跳过了每个输入行的第一行 ( NR==1 { next })。如果它们包含有用的标头,您当然也可以通过将其更改为NR==1 { print; next }然后删除echo我上面添加的来使用它们。

相关内容