怎么算“|”在通过awk命令的csv文件中?

时间:2014-05-14 09:11:13

标签: bash awk count

我有一个文件如下

"a"|"a|b|c|d"|"as|ds"

我想计算" |"的总数。获得确切的列数。

4 个答案:

答案 0 :(得分:3)

awk -F'"[|]"' '{print NF}'

将返回列数(NF是内置变量,返回字段数)

编辑:使用[]环绕管道以使其转义并且它可以正常工作。

答案 1 :(得分:2)

如果您有gnu awk版本4+,则可以使用FPAT指定数据的外观,然后计算。

echo '"a"|"a|b|c|d"|"as|ds"' | awk '{print NF}' FPAT='"([a-z]+[|]*)+"'
3

要查看专栏:

echo '"a"|"a|b|c|d"|"as|ds"' | awk '{print "1="$1,"2="$2,"3="$3}' FPAT='"([a-z]+[|]*)+"'
1="a" 2="a|b|c|d" 3="as|ds"

但是,由于FS有效,我会使用awk -F'"[|]"' '{print NF}'

答案 2 :(得分:1)

awk '{print gsub(/\"\|\"/,"&",$0)}' input.txt

打印"|"的替换数,即其计数,所以

awk '{print gsub(/\"\|\"/,"&",$0) +1 }' input.txt

将是列数。

"&"表示将匹配的字符串替换为自身,即无变化。

<小时/> 的修改

或使用

awk -F'["][|]["]' '{print NF}' input.txt

打印列数和此

awk -F'["][|]["]' '{print NF-1}' input.txt

"|"

的数量

答案 3 :(得分:0)

您可以尝试以下perl脚本:

#! /usr/bin/perl

use warnings;
use strict;
use Text::CSV;


my $csv = Text::CSV->new({ sep_char => '|' });

while (<>) {
   $csv->parse($_);
   my @fields = $csv->fields();
   print scalar @fields,"\n";
}