解析文件中的数字

时间:2015-05-27 12:37:44

标签: regex bash awk

header
//
SeqT: {"POS-s":174.683, "time":0.0130084}
SeqT: {"POS-s":431.49, "time":0.0221447}
[25]: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

在我分裂的那一刻

!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
}

使用第一个文件生成四个文件

[25]: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

第四个文件只有括号中的数字

25
29

我需要使用两个colums(空格分隔)生成第五个文件

174.683 0.00130084
431.49 0.0221447 

所以这些是始终以SeqT开头的两行数,并且始终是“POS-S”之后的第一列,另一段是时间之后......我怎样才能进入awk脚本?

2 个答案:

答案 0 :(得分:1)

你可以按照以下方式为你的程序添加另一个语句:

sub(/^SeqT: {"POS-s":/,"") && sub(/, "time":/," ") && sub(/}$/,"") {print >"fifth_"FILENAME}
如果执行替换,则

sub返回true,因此如果每个替换都成功(并且因此执行了块),则留下两个以空格分隔的数字。

正如评论中正确指出的那样,如果标题部分中的行也可能与这三种模式匹配,那么您还应该添加body条件,即body && sub(/^Seqt...

答案 1 :(得分:1)

您可以使用以下正则表达式进行匹配:

SeqT: {"POS-s":(\d+(?:\.\d+)?), "time":(\d+(?:\.\d+)?)}

$1 $2替换

请参阅DEMO

脚本:

body  && sub(/SeqT: {"POS-s":(\d+(?:\.\d+)?), "time":(\d+(?:\.\d+)?)}/,"$1 $2") {print > "fifth_"FILENAME}