awk在多个文件和每个文件的管道输出分别运行到wc命令

时间:2016-10-14 15:11:38

标签: bash awk pipe multiple-files

我有一堆记录明智的格式化(.csv)文件。第一个字段是整数,也可以是空的。它适用于所有文件。我想计算每个文件中第一个字段为空的记录数,然后想要在所有文件上绘制计数图。

filename.csv的文件格式:

123456,few,other,fields
,few,other,fields 
234567,few,other,fields

我想要像

这样的东西
awk -F, '$1==""' `ls` | (for each file separately  wc -l) | gnugraph ( y axis as output of wc -l command and x axis as simply 1 to n where n is number of csv files)

我面临的问题是wc -l只对所有文件执行一次。我想为每个文件运行wc -l并计算具有空第一个字段的记录数,并将此计数序列提供给gnugraph命令。 一旦我得到每个文件的必要计数,我几乎完成了

seq 10 | gnuplot -p -e "plot '<cat'"

工作正常

4 个答案:

答案 0 :(得分:1)

您可以使用awk来跟踪数组中每个文件的计数。然后在最后打印数组的内容:

  awk '$1==""{a[FILENAME]+=1} END{for(file in a) { print file, a[file] }}' `ls`

这样您就不必与wc纠缠在一起,只需将内容拍摄到gnuplot

使用示例:

$> cat file1
,test
2,test
3,
$> cat file2
,test
2,test
3,
,test
$> awk -F"," '$1==""{a[FILENAME]+=1} END{for(file in a) { print file, a[file] }}' `ls`
file1 1
file2 2

答案 1 :(得分:1)

使用 gawk ,您可以使用BEGINFILEENDFILE

$ awk -F, '$1==""{++i} BEGINFILE{i=0} ENDFILE{print FILENAME, i}' file1 file2
file1 3
file2 1

答案 2 :(得分:0)

如果您想为每个文件单独运行wc -l,则必须设置循环。

有些事情 -

for i in `ls`
do
    awk -F, '$1==""' "$i" | wc -l 
done | gnugraph 

答案 3 :(得分:0)

对于第一个字段,if (Request.IsAjaxRequest()) return PartialView("_Index", VM); return View(VM);

有一种更简单的方法
grep

我将你的文件复制到file1并分别在file2和file3中加倍