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
(将被错误地丢弃)等行。