11

我有这个字符串

-foo {{0.000 0.000} {648.0 0.000} {648.0 1980.0} {0.000 1980.0} {0.000 0.000}}

我想将它分隔为数字并对其进行迭代,感谢尝试使用字段分隔符但没有成功我如何使用 awk 来做到这一点?

4

4 回答 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是一个正则表达式,它可以匹配任何由|
  • 在 中}+|{+|,我们可以选择匹配一个文字}至少一个 : +,或者一个文字{至少一个 : +,或者一个空格。
  • 您也可以使用一类角色来做同样的事情:[{} ],两者都有效
于 2013-03-27T17:14:52.367 回答
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
于 2013-03-27T17:17:12.610 回答
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
于 2013-03-28T12:23:55.077 回答
0

诚然,我的想法很简单。根据我的经验,字段分隔符的正则表达式示例是最值得学习的,尤其是当您必须处理 XML 等时。但是在这种情况下,我们必须记住,当遇到不相关的字符时,UNIX 为您提供了许多选择. 一个简单的解决方法是删除不需要的字符。有多种方法,但我会这样使用tr -d '{}'

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

从 2 开始循环计数器i只是跳过第一个参数 ( -foo)的快速方法

于 2013-11-07T19:47:48.900 回答