我想使用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])}'
其他答案给出了工作解决方案,但是他们没有真正解释这个问题。
问题是在一个普通的{ ... }
块内设置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
的值可能是好的,但是我总是习惯使用双引号, 以防万一。)