Awk 如何在文件中打印数值
我有一个文件包含一些文本行,一些只包含数字,另一些包含文本+数字,我想只保留那些只包含数字的行,保持数据的相同顺序 我的输入文件Awk 如何在文件中打印数值,awk,sed,Awk,Sed,我有一个文件包含一些文本行,一些只包含数字,另一些包含文本+数字,我想只保留那些只包含数字的行,保持数据的相同顺序 我的输入文件 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 大肥肉警告 这种方法不是很健壮,如果需要正确
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
大肥肉警告
这种方法不是很健壮,如果需要正确的数字解析,请使用。将通过的无效行示例:
--
…
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
35.0000 0.0250
1.0000 0.0370
2.0000 -0.0390
解释
此表达式定义字符组([0-9.-]
),即数字、点、空格和连字符,并查找其中一个或多个(\+
)。插入符号(^
)和美元($
)锚定匹配,因此需要匹配整行
整行匹配有一个速记(-x
),因此您也可以使用:
grep -x '[0-9. \teE-]\+' infile
与
awk类似
$ 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-vofs='\t'{for(i=1;i这个冗长的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
35.0000 0.0250
1.0000 0.0370
2.0000 -0.0390
额外的,egrep-o
也适用于上述eregexp,如果每行需要一个结果。输出:
35.0000
0.0250
1.0000
0.0370
2.0000
-0.0390
注意:\b
(单词边缘的空字符串)表达式认为-
字符不是单词的一部分,因此它必须遵循符号检查:[-+]?\b
。错误使用\b[-+]?
会导致-o
切换为不返回符号
(上面的代码大部分是从正则表达式.info中借用的)
请注意,这将传递电话号码999-999-9999
或日期2017-03-04
。它还将传递仅--
或..
的行,并且不允许使用指数数字(如果OP有或没有指数数字,请输入idk,但为什么假设他没有指数数字?)@EdMorton:没错,没有验证数字的有效性。我仍然认为这种简单的方法值得保留,假设用户知道输入中没有这样的无效行,这是一种计算效率更高的方法。我不同意这种方法值得保留,这种方法在使用特定的示例输入集,然后在6个月后,当它在实际数据上运行时神秘和/或无声地失败时,它会回来咬你。@EdMorton:我完全不同意,在某些情况下效率是最重要的。但是,我明白你的意思,我添加了一个BFW。正确的方法。避免在每行末尾添加空白字符是一个tiny调整:{c=0;for(i=1;i你的数据能包括指数数字吗?以+
开头的数字怎么样?你能在一个字段中有一个数字,在另一个字段中有一个非数字的行吗(例如foo 17
)如果是这样的话,应该如何处理这些问题?你的问题应该包括这些问题的答案。为什么这个问题会被否决?这是一个标准的“我有这个问题,我想要这个答案”的问题。OP没有做出任何努力或任何尝试。非常好和简单answer@MohsenEl-塔哈维:是的,但这不是对你的问题的回答问。@EdMorton你为什么这么说?它起作用了。你说我只想保留只有数字的行。这个答案不会这样做。它只会在行的某个地方保留包含.0000
的行,所以它会丢弃只包含数字但没有包含.0000
的行,然后它会l打印包含文本和数字混合的行。尝试使用flying monkeys XXX.0000XXX
(将被错误地打印)或3.1415 555.1212
(将被错误地丢弃)等行。