![awk:在循环中添加带有文件名的列名](https://linux22.com/image/149846/awk%EF%BC%9A%E5%9C%A8%E5%BE%AA%E7%8E%AF%E4%B8%AD%E6%B7%BB%E5%8A%A0%E5%B8%A6%E6%9C%89%E6%96%87%E4%BB%B6%E5%90%8D%E7%9A%84%E5%88%97%E5%90%8D.png)
我有一个在 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.csv
和bar.csv
,给出如下输出:
bar foo
4.33333 2.5
3.8 3.5
我注意到您还跳过了每个输入行的第一行 ( NR==1 { next }
)。如果它们包含有用的标头,您当然也可以通过将其更改为NR==1 { print; next }
然后删除echo
我上面添加的来使用它们。