我有一个文件包含一些文本行,一些文件只包含数字,另一些包含文本+数字,我想只保留只有数字保持相同数据顺序的行。
我的输入文件
35.0000 0.0250
line1
line2
table1
file
1.0000 0.0370
line4
2.0000 -0.0390
所需的输出文件
35.0000 0.0250
1.0000 0.0370
2.0000 -0.0390
答案 0 :(得分:3)
与$ awk '!/[^0-9. -]/' file
35.0000 0.0250
1.0000 0.0370
2.0000 -0.0390
awk -v OFS='\t' '{for(i=1;i<=NF;i++)
if($i+0==$i) {f=1; printf "%s", $i OFS}
if(f) print ""; f=0}' file
然而,要真正检查数字,你应该使用类似的东西
$ awk -v OFS='\t' '{for(i=1;i<=NF;i++) if($i+0!=$i) next} $1=$1' file
这也会标准化线条中的间距。这会过滤掉非数字,但会将数字保留在同一行。
如果您有任何非数字标记,则完全消除该行,可将其简化为
999-999-999
第二个脚本不会传递代码0..10
,2017-03-04
或+3.00
以及接受指数(科学)表示法或明确定义的正数{{1}}
答案 1 :(得分:1)
这种方法不是很健壮,如果需要正确的数字解析,请使用karakfa's answer。 传递的无效行示例:
---
...
999-999-9999
2017-03-04
对于这么简单的任务,您不需要sed
或awk
,grep
就足够了:
grep '^[0-9. \teE-]\+$' infile
输出:
35.0000 0.0250
1.0000 0.0370
2.0000 -0.0390
此表达式定义一个字符组([0-9. -]
),即数字,点,空格和连字符,并查找其中的一个或多个(\+
)。插入符号(^
)和美元($
)锚定匹配,因此需要匹配整行。
整线匹配(-x
)有一个简写,所以你也可以选择:
grep -x '[0-9. \teE-]\+' infile
答案 2 :(得分:1)
awk '/\.0000/' file
35.0000 0.0250
1.0000 0.0370
2.0000 -0.0390
答案 3 :(得分:0)
这个冗长的<form action="{{ url("/Accounts/$userAccount->id") }}" method="POST">
{{ csrf_field() }}
{{ method_field('DELETE') }}
<button type="submit">delete</button>
</form>
代码似乎有效,并允许浮点:
egrep
输出:
egrep '[-+]?\b[0-9]*\.?[0-9]+\b|[-+]?\b[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?\b' infile
奖金, 35.0000 0.0250
1.0000 0.0370
2.0000 -0.0390
也适用于上述 eregexp ,如果每行需要一个结果。输出:
egrep -o
注意:35.0000
0.0250
1.0000
0.0370
2.0000
-0.0390
(单词边缘的空字符串)表达式将\b
char视为而不是单词的一部分,因此必须遵循标志检查:-
。错误地使用[-+]?\b
会导致\b[-+]?
开关无法返回符号。
<子> (以上代码主要借用 regular-expressions.info 的Matching Floating Point Numbers with a Regular Expression)。