如何在文件

时间:2017-03-04 14:52:38

标签: 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

4 个答案:

答案 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..102017-03-04+3.00以及接受指数(科学)表示法或明确定义的正数{{1}}

答案 1 :(得分:1)

大脂肪警告

这种方法不是很健壮,如果需要正确的数字解析,请使用karakfa's answer 传递的无效行示例:

  • ---
  • ...
  • 999-999-9999
  • 2017-03-04

答案

对于这么简单的任务,您不需要sedawkgrep就足够了:

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)。