在 awk 中用 e 读取数字

在 awk 中用 e 读取数字

你好,我正在处理的文件如下所示:

   header
//
SeqT: {"POS-s":174.683, "time":0.0130084}
SeqT: {"POS-s":431.49, "time":0.0221447}
[2.04545e+2]:0.00843832,469:0.0109533):0.00657864,((((872:0.00120503,((980:0.0001);
[29]:((962:0.000580339,930:0.000580339):0.00543993);
absolute:
gthcont: 5 4 2 1 3 4 543 5  67 657  78 67 8  5645 6 
01010010101010101010101010101011111100011
1111010010010101010101010111101000100000
00000000000000011001100101010010101011111

使用 awk 中的此代码

    !body && /^\/\/$/              {body=1}
body  && sub(/^gthcont: */,"") {print > "second_"FILENAME}
body  && /^[01]+/              {print > "third_"FILENAME}
body  && /^\[[0-9]+\]/ {
    print > "first_"FILENAME
    print substr($0, 2, index($0,"]")-2) > "fourth_"FILENAME
}
sub(/^SeqT: {"POS-s":/,"") && sub(/, "time":/," ") && sub(/}$/,"") { print >"fifth_"FILENAME}

我需要将其拆分成五个文件。第一个文件是

[2.04545e+2]:0.00843832,469:0.0109533):0.00657864,((((872:0.00120503,((980:0.0001);
[29]:((962:0.000580339,930:0.000580339):0.00543993);

第二个文件必须是

5 4 2 1 3 4 543 5  67 657  78 67 8  5645 6

下一个文件必须是

01010010101010101010101010101011111100011
11110100100101010101010101111010001000001
00000000000000011001100101010010101011111

第四个文件应该包含第一个文件括号内的数字。在这种情况下,它只能是

2.04545e+2
29

最后一个文件

174.683 0.00130084
431.49 0.0221447 

代码可以工作,但问题是它在使用科学符号(e+7 和类似的东西)时存在问题。在此行中,文件中没有打印输出,只包含来自 [] 的数字。因此,目前文件看起来不像 2.04545e+2 29,而只是

29..

我怎样才能调整 awk 以便也能读取 [] 中的 sci 符号?

答案1

您需要将仅匹配方括号内一个或多个数字的正则表达式替换/^\[[0-9]+\]/为与浮点输入匹配的正则表达式。

例如,取表达式

[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?

带有指数的浮点数来自 Jan Goyvaerts 的使用正则表达式匹配浮点数教程并将其替换到您的 awk 代码中:

awk 'BEGIN{body=0}
!body && /^\/\/$/    {body=1}
body  && /^\[/       {print > "first_"FILENAME}
body  && /^pos/{$1="";print > "second_"FILENAME}
body  && /^[01]+/    {print > "third_"FILENAME}
body  && /^\[[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?\]/ {
  print > "first_"FILENAME
  print substr($0, 2, index($0,"]")-2) > "fourth_"FILENAME
}' file

使用您的示例输入file,您现在应该得到

$ cat fourth_file 
2.04545e+2
29

相关内容