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

count number of values in each field in awk, output table

我正在尝试计算大 table 的每个字段中出现的 elements/words 的数量。字段由空格分隔,字段元素 ("words") 由逗号分隔。 table也包含空字段(例如两个或多个连续的空格),相当于0个元素。

例如,来自这样的 table:

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 [=13=]}' input

我将每个字段 i 拆分为包含 n 个元素的数组 a,并将此值分配给变量 $i。在给定字段中有0个元素的情况下,(!$i), $i=0.

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

val1 3 3 1
val2 2 1 1
val3 2

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

谁能帮帮我?非常感谢!

您必须指定您想要一个白色 space 作为字段分隔符:

awk -F"[ ]" '{str= 
              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

与printf基本相同的解决方案

$ awk -F'[ ]' '{printf "%s ", ; 
                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