如何在awk循环中打印插入

时间:2016-09-08 01:15:21

标签: awk

如何在循环中打印文件名?我想在同一行打印文件名和第4列的平均值:

for i in `ls *cov`
do
awk '{sum +=$4;n++}END{print sum/n}' $i
done

我的意思是我想

awk '{sum +=$4;n++}END{print $i\t sum/n}' $i

2 个答案:

答案 0 :(得分:1)

您可以使用-v标志在awk脚本中使用bash变量:

awk -v file=$i '{sum +=$4;n++}END{print file\t sum/n}' $i

但是,还有built in awk variable FILENAME

 awk '{sum +=$4;n++}END{print FILENAME\t sum/n}' $i

由于你没有绕过变量,所以更清洁。

答案 1 :(得分:1)

丢失循环(参见why-is-using-a-shell-loop-to-process-text-considered-bad-practice)并使用:

awk -v OFS='\t' '{sum+=$4} ENDFILE{print FILENAME, (FNR>0 ? sum/FNR : 0); sum=0}' *cov

以上使用GNU awk for ENDFILE,对其他awks进行了简单的调整,但重要的是:

  1. 周围的shell循环既不是必需的也不是理想的。
  2. 由于awk内置了变量,因此不需要变量n
  3. 你必须保护自己免于空文件的零除。