计算 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
我正在尝试计算大 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