计算awk,输出表中每个字段中的值的数量

时间:2016-03-21 17:36:19

标签: awk gawk

我试图计算大表每个字段中存在的元素/单词的数量。字段由空格和字段元素("单词")以逗号分隔。该表还包含空字段(例如,两个或多个连续的空格),相当于0个元素。

例如,从这样的表:

val1 this,is,text this,more,text  stop
val2  this,is a field
val3    end,text

这将是所需的输出:

val1 3 3 0 1
val2 0 2 1 1
val3 0 0 0 2

(我希望按原样保留第一列)

请注意,第一行中stop值前面有两个空格,表示第四个字段有0个元素。类似的事情发生在其他方面。

我一直在使用awk的split函数创建一个数组,每个字段都有所需数量的元素:

awk '{ for(i = 2; i <= NF; i++) {
$i=split($i,a,",") ; { if (!$i) { $i="0" }};
}; print $0}' input

我将每个字段i拆分为an元素的数组$i,并将此值分配给变量!$i。对于给定字段中的0个元素,($i=0),val1 3 3 1 val2 2 1 1 val3 2

但这是我当前不需要的输出:

boolean flag=true;
int i=0;
while(i<allopts && flag)
{
if(conditons)//Put your conditions
{
//code
flag=false;
}
i++;
}

如您所见,省略了0个值。我认为将0值分配给空字段存​​在一些问题。

任何人都可以帮助我吗?非常感谢提前!

2 个答案:

答案 0 :(得分:3)

您必须指定一个空格作为字段分隔符:

awk -F"[ ]" '{str=$1 
              for(i=2; i<=NF; i++){str=str" "split($i, arr, ",")}
              print str}' test1

在这种情况下,输出为:

val1 3 3 0 1
val2 0 2 1 1
val3 0 0 0 2

答案 1 :(得分:3)

与printf基本相同的解决方案

$ awk -F'[ ]' '{printf "%s ", $1; 
                for(i=2;i<=NF;i++) printf "%s ", split($i,a,","); 
                print ""}' file

val1 3 3 0 1
val2 0 2 1 1
val3 0 0 0 2