如何在 awk 中用 \s 设置不同的分隔符?

How to set different separator with \s in awk?

text(1后为空白(space \t\f\v)):

1    23.4,56

我想要打印 $3 的结果是 4。 但是 运行 echo "1 23.4,56" | awk -F'[\s+|,|.]' '{print }' , 结果是 56

能否请您尝试以下。使用 GNU awk.

中显示的示例编写和测试
echo "1    23.4,56" | awk -F'[.,]' '{print }'

或者根据您的意见,您希望在字段分隔符中 space 然后尝试以下,我们需要在此处使用 [[:space:]]

echo "1    23.4,56" | awk -F'[[:space:]]+|[.,]+' '{print }'

echo "1    23.4,56" | awk -F'[:.,[:space:]]+' '{print }'

要查看字段编号和字段值如何,运行 如下;出于理解目的(对于第一个解决方案)。

echo "1    23.4,56" | awk -F'[.,]' '{for(i=1;i<=NF;i++){print "Field number:"i,"Field value:"$i}}'
Field number:1 Field value:1    23
Field number:2 Field value:4
Field number:3 Field value:56

你只需要调整你的FS。有几种可能,这是一种方式:

$ echo "1    23.4,56" | awk -F'[ ,.]*' '{print }'
1
$ echo "1    23.4,56" | awk -F'[ ,.]*' '{print }'
23
$ echo "1    23.4,56" | awk -F'[ ,.]*' '{print }'
4
$ echo "1    23.4,56" | awk -F'[ ,.]*' '{print }'
56

另一种方式:

$ echo "1    23.4,56" | awk -F'[,.]|\s+' '{print }'
4

另一种方式,这次是区域设置感知:

$ echo "1    23.4,56" | awk -F'[,.]|[[:space:]]+' '{print }'
4
$ echo "1    23.4,56" | awk -F'[[:space:],.]+' '{print }'
4

使用 GNU awk,而不是使用 FS,您可以使用 FPAT:

$ echo "1   23.4,56" | awk  'BEGIN { FPAT="[^ .,]+" }  { print  }'
4

FPAT的值应该是一个字符串,它提供了描述每个字段内容的正则表达式。更多信息请访问:https://www.gnu.org/software/gawk/manual/html_node/Splitting-By-Content.html

I want result of print is 4.

FS的一些改动,你的代码可以搞定:

echo "1    23.4,56" | awk -F'[,.]|[[:blank:]]+' '{print }'
4