AWK 中的多重拆分



我想使用 AWK 执行 2 个拆分(我有 2 个字段分隔符),我正在处理的数据字符串如下所示:

data;digit&int&string&int&digit;data;digit&int&string&int&digit

如您所见,外部字段分隔符是分号,嵌套的分隔符是与号。我正在对awk所做的是(假设字符串将在名为test的变量中)

echo ${test} | awk '{FS=";"} {print $2}' | awk '{FS="&"} {print $3}'

应该捕获"字符串"字,但由于某种原因这不起作用。似乎第二个管道没有被应用,因为我只看到第一个awk函数的结果有什么建议吗?

使用 awk 数组

echo $test | awk -F';' '{split($2, arr, "&"); print(arr[3])}'

试试:

echo "$test" | awk -F'[;&]' '{print $4}'

我在-F'[;&]'中指定了一个多分隔符

其他答案给出了可行的解决方案,但它们并没有真正解释问题。

问题在于,在常规{ ... }块中设置FS awk脚本不会导致当前行重新计算$1$2等;因此FS将为以后的任何行设置,但第一行已经被空格分割。要在运行脚本之前设置FS,可以使用BEGIN块(在第一行之前运行);或者,您可以使用"-F命令行"选项。

进行这些更改中的任何一个都将修复您的命令:

echo "$test" | awk 'BEGIN{FS=";"} {print $2}' | awk 'BEGIN{FS="&"} {print $3}'
echo "$test" | awk -F';' '{print $2}' | awk -F'&' '{print $3}'

(我还冒昧地将$test括在双引号中,因为未带引号的参数扩展会带来麻烦。以你的值$test本来很好,但我养成了总是使用双引号的习惯,以防万一。

相关内容

  • 没有找到相关文章

最新更新