awk 处理多个文件,并将每个文件的运行输出分别通过管道传输到 wc 命令

问题描述 投票:0回答:4

我有一堆记录明智的格式(.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'"

工作正常

bash awk pipe
4个回答
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
投票

通过 gawk,您可以使用

BEGINFILE
ENDFILE

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

0
投票

如果您想为每个文件单独运行

wc -l
,则必须设置一个循环。

类似的东西-

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

0
投票

对于第一个字段,有一个更简单的方法

grep

$ grep -c '^,' file{1..3}

file1:1
file2:2
file3:4

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

© www.soinside.com 2019 - 2024. All rights reserved.