2

我想使用 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 函数的结果有什么建议吗?

4

3 回答 3

5

使用 awk 数组

echo $test | awk -F';' '{split($2, arr, "&"); print(arr[3])}'
于 2012-10-12T15:12:16.800 回答
4

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

问题是FS在常规{ ... }块内设置awk脚本不会导致$1,$2等为当前行重新计算;soFS将为后面的行设置,但第一行已经被空格分割。要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会很好,但我养成了总是使用双引号的习惯,以防万一.)

于 2012-10-12T15:15:21.713 回答
3

试试看:

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

我在-F'[;&]'

于 2012-10-12T15:09:50.537 回答