dov*_*vah 6 awk text-processing
我正在尝试构建一个 awk 语句来读取此文件:
A 1,2,3 *
A 4,5,6 **
B 1
B 4,5 *
Run Code Online (Sandbox Code Playgroud)
并构建一个这样的文件:
A 1,2,3 * 3 1 0.333
A 4,5,6 ** 3 2 0.666
B 1 1 0 0
B 4,5 * 2 1 0.5
Run Code Online (Sandbox Code Playgroud)
在这个新文件中,前三列与原始文件中的相同。第四列必须包含第 2 列中逗号分隔的元素数。第五列必须包含第 3 列中的字符数。最后一列包含第 5 列在第 4 列中的比例(即第 5 列除以第 4 列)。
我正在尝试以下代码:
awk '{print $1"\t"$2"\t"$3"\t"(NF","$2 -1)"\t"length($3)"\t"(length($3)/(NF","$2-1))}' file1 > file2
Run Code Online (Sandbox Code Playgroud)
但我得到了以下输出:
A 1,2,3 * 3,0 1 0.333333
A 4,5,6 ** 3,3 2 0.666667
B 1 2,0 0 0
B 4,5 * 3,3 1 0.333333
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚我在第 4 列中做错了什么。
您似乎希望(NF","$2 -1)
将其视为一个函数,该函数将返回字段中以逗号分隔的元素的数量$2
- 它不会。NF
始终是记录中的字段数。
相反,您可以使用 awk 的split
函数split($2,a,",")
,该函数将字段拆分$2
为一个数组a
并返回元素的数量。您还可以通过使用将输出文件分隔符设置为制表符而不是在打印语句中使用显式“\t”来整理代码
awk '{l2=split($2,a,","); OFS="\t"; print $1, $2, $3, l2, length($3), length($3)/l2}' file1
Run Code Online (Sandbox Code Playgroud)