AWK中的多分裂

我想使用AWK执行2次分割(我有2个字段分隔符),我正在处理的数据string看起来像这样:

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

正如你所看到的外部字段分隔符是一个分号,嵌套的是一个&符号。 我用awk做的是(假设string将在一个名为test的variables中)

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

这应该赶上“string”的话,但由于某种原因,这是行不通的。 它看起来像第二个pipe道没有被应用,因为我只看到第一个awk函数的结果任何build议?

尝试一下:

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

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

使用awk数组

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

其他答案给出了工作解决方案,但是他们没有真正解释这个问题。

问题是在一个普通的{ ... }块内设置FSawk脚本不会导致$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的值可能是好的,但是我总是习惯使用双引号, 以防万一。)