我有一个文件如下
"a"|"a|b|c|d"|"as|ds"
我想计算" |"的总数。获得确切的列数。
答案 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";
}