我有一个脚本来比较一堆CSV文件中的一些列。 它工作正常,但有一些东西正在扰乱我。使用AWK将FILENAME打印到CSV
下面是代码:
FILES=./*
for f in $FILES
do
cat -v $f | sed "s/\^A/,/g" > op_tmp.csv
awk -F, -vOFS=, 'NR == 1{next} $9=="T"{t[$8]+=$7;n[$8]} $9=="A"{a[$8]+=$7;n[$8]} $9=="C"{c[$8]+=$7;n[$8]} $9=="R"{r[$8]+=$7;n[$8]} $9=="P"{p[$8]+=$7;n[$8]} END{ for (i in n){print i "|" "A" "|" a[i]; print i "|" "C" "|" c[i]; print i "|" "R" "|" r[i]; print i "|" "P" "|" p[i]; print i "|" "T" "|" t[i] "|" (t[i]==a[i]+c[i]+r[i]+p[i] ? "ERROR" : "MATCHED")} }' op_tmp.csv >> output.csv
rm op_tmp.csv
done
只是解释: 我上目录中的所有文件,然后我使用CAT来代替除数^一种用于管道|。 然后我使用awk onliner比较我需要的列并将结果输出到output.csv。
但现在我想在每个循环之前打印文件名。 我试图用sed的猫和awk在同一直线上,并打印$文件名,但它不工作:
cat -v $f | sed "s/\^A/,/g" | awk -F, -vOFS=, 'NR == 1{next} $9=="T"{t[$8]+=$7;n[$8]} $9=="A"{a[$8]+=$7;n[$8]} $9=="C"{c[$8]+=$7;n[$8]} $9=="R"{r[$8]+=$7;n[$8]} $9=="P"{p[$8]+=$7;n[$8]} END{ for (i in n){print i "|" "A" "|" a[i]; print i "|" "C" "|" c[i]; print i "|" "R" "|" r[i]; print i "|" "P" "|" p[i]; print i "|" "T" "|" t[i] "|" (t[i]==a[i]+c[i]+r[i]+p[i] ? "ERROR" : "MATCHED")} }' > output.csv
谁能帮助?
即使没有gawk,你也可以和其他一些调整一起,将END块放在一个函数中,并在'FNR == 1'和'END'条件下调用它,你不需要shell循环。 'ENDFILE'出现在gawk 4.0 btw中,请参阅http://www.gnu.org/software/gawk/manual/gawk.html#Feature-History。 –
重写工作,最终我会更新到类似的东西,但现在我只是调整使用变量$ fname并在每个循环之前打印。还删除了临时文件和猫。万分感谢。 –