我想使用 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
本来很好,但我养成了总是使用双引号的习惯,以防万一。