我有这个字符串
-foo {{0.000 0.000} {648.0 0.000} {648.0 1980.0} {0.000 1980.0} {0.000 0.000}}
我想将它与数字分开并迭代它们,谢谢 尝试使用字段分隔符但没有成功我怎么能用awk做到?
答案 0 :(得分: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
是一个正则表达式,可以匹配由|
}+|{+|
中,我们可以选择匹配文字}
至少一个:+
或文字{
至少一个:+
或者是一个空间。[{} ]
,两者都有效答案 1 :(得分: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
答案 2 :(得分: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
答案 3 :(得分:0)
不可否认,我的提议非常简单。根据我的经验,字段分隔符的正则表达式示例是最有价值的,特别是如果您必须处理XML等。但在这种情况下,我们必须记住UNIX为您提供许多备选方案当面对不相关的人物时。一个简单的解决方法就是删除不需要的字符。有各种方法,但我会像tr -d '{}'
这样使用:
tr -d '{}' file.txt | awk '{ for( i=2; i<=NF; i++ ) print $i }'
在2处启动循环计数器i
只是跳过第一个参数(-foo
)的快速方法