awk中的多个字段分隔符

11

我有这个字符串

-foo {{0.000 0.000} {648.0 0.000} {648.0 1980.0} {0.000 1980.0} {0.000 0.000}}
我想将它分成数字并对它们进行迭代处理,谢谢。我尝试使用字段分隔符但没有成功,如何使用awk实现?

你在寻找一个正则表达式吗?类似于\d+\.\d+这样的吗? - sp00m
是的,但我已经明白 \d+ 不能在 awk 中使用。 - ilansh
4个回答

17

试着这样做:

awk -F'}+|{+| ' '{for (i=1; i<=NF; i++) if ($i ~ "[0-9]") print $i}' file.txt

字段分隔符FS(使用-F开关)可以是字符、单词、正则表达式或一类字符。

您也可以使用这个:

awk 'BEGIN{FS="}+|{+| "} {for(i=1;i<=NF;i++) if($i ~ "[0-9]")print $i}' file.txt

解释

  • foo|bar|base 是一个正则表达式,它可以匹配由 | 分隔的任何字符串。
  • }+|{+| 中,我们可以选择匹配至少一个字面量 }+,或者至少一个字面量 {+,或者一个空格。
  • 你也可以使用字符类来完成相同的工作:[{} ],两种方法都可以。

谢谢Sputnick,你能解释一下 '}+|{+|' 分隔符吗? - ilansh
@stArdust 我想要使用冒号或空格作为分隔符,但是似乎 awk -F ':| ' 不起作用。我有什么遗漏吗?谢谢。 - user1663023
我找到了答案:awk -F ':[ \t]*|[ \t]+'。感谢这个链接:http://softpanorama.org/Tools/Awk/awk_regular_expressions.shtml - user1663023

1
一种使用awk的方法:

awk -F'[{} ]' '{ for( i=1; i<=NF; i++ ) if( $i ~ /[0-9.]+/ ) print $i }' file

在上面的代码行中,我们遍历了这些数字,但我并没有做任何特殊处理,只是将它们打印出来。你可以在那部分添加自己的逻辑。
输出:
0.000
0.000
648.0
0.000
648.0
1980.0
0.000
1980.0
0.000
0.000

1
如果您只想在新行上显示每个数字,则只需使用grep:
$ egrep -o '[0-9]+\.[0-9]+' file
0.000
0.000
648.0
0.000
648.0
1980.0
0.000
1980.0
0.000
0.000

0

诚然,我在我的建议中非常简单。根据我的经验,学习字段分隔符的正则表达式示例是最有价值的,特别是如果您必须处理XML等内容。但在这种情况下,我们必须记住,当遇到无关字符时,UNIX会给您提供许多替代方案。一个简单的解决方法是只需删除不需要的字符。有各种方法,但我会使用tr -d '{}' ,如下所示:

tr -d '{}' file.txt | awk '{ for( i=2; i<=NF; i++ ) print $i }'

将循环计数器 i 设为2只是一个快速跳过第一个参数(-foo)的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接