大文件的awk脚本

时间:2015-08-22 13:16:19

标签: bash awk sed

我正在处理的文件看起来像

Mutation: {"seq-pos":4621.88, "time":0.280423, 1.28819, 1.35223}
[17179](((((112:0.0145017,(142:0.00930338,25:0.00930338):0.00519828):0.00880547,(33:0.00627446,(51:0.00314998,(63:0.000494482,(60:7.$
Mutation: {"seq-pos":34226.9, "time":0.280423, 0.3161, 1.35223}
[34782](((((112:0.0145017,(142:0.00930338,25:0.00930338):0.00519828):0.00880547,(33:0.00627446,(51:0.00314998,(63:0.000494482,(60:7.$
[24088](((((112:0.0145017,(142:0.00930338,25:0.00930338):0.00519828):0.00880547,(33:0.00627446,(51:0.00314998,(63:0.000494482,(60:7.$
Mutation: {"seq-pos":80666, "time":0, 0.0936928, 0.114032}
[16807]((((71:0.00394144,(32:0.000204658,(145:5.25517e-05,27:5.25517e-05):0.000152107):0.00373678):0.150355,(68:0.0393174,((125:0.00$
[7144](((68:0.0393174,((125:0.00135707,70:0.00135707):0.0295768,((((110:0.00771258,95:0.00771258):0.000175535,((85:0.00143738,54:0.0$
segsites: 14
positions: 0.0462188 0.273957 0.275629 0.284955 0.30393 0.342269 0.364361 0.433485 0.730241 0.750358 0.80666 0.80674 0.846499 0.9809$
10001100100100
00000010000000
10001100100100
10000100100000
10000100100100
10010100100000
10001100100100
00000010000000
10000100100100
10000100100100
10000100100100
10000100100100
10000100100100
10001101100100

我所使用的当前脚本

!body && /^\/\/$/              {body=1}
body  && sub(/^gthcont: */,"") {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
}

所以第一个文件包含以[]开头的所有行,第二个所有位置,第三个行和第十四个行括号中的数字。 我需要得到第五个存储突变的文件 thsi文件看起来像

4621.88 0.280423 1.28819 1.35223
34226.9 0.280423  0.3161  1.35223
80666 0  0.0936928 0.114032

我需要更改显示abov的脚本的步骤?那会很棒

我的想法是

/^Mutation/ {gsub(/[^0-9. ]/,""); print >"fifth_"FILENAME}

但不做我想要的事情

如果我这样做..

!body && /^\/\/$/              {body=1}
body  && sub(/^gthcont: */,"") {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
}
  /^Mutation/ {gsub(/[^0-9. ]/,""); print >"fifth_"FILENAME}

它不起作用......得到不是一个过滤器

1 个答案:

答案 0 :(得分:0)

如果你可以依赖结构,这个awk hack会做

awk -F"[:,}]" '/^Mutation/{print $3,$5,$6,$7}'

我不确定它将如何与剧本的其余部分一起播放。

如果必须嵌入现有脚本而不更改字段分隔符,则可以使用

$ awk '/^Mutation/ {gsub(/[[:alpha:]]/,"");gsub(/[{\-":,}]/,""); print}' data.txt 
4621.88 0.280423 1.28819 1.35223
34226.9 0.280423 0.3161 1.35223
80666 0 0.0936928 0.114032

删除所有字母和标点符号,剩下的是你的号码。请注意,它会删除-,这也可能是数字的符号,因此这不是一个强大的脚本。 (你不能使用[[:punct:]]来删除小数点)。我不确定是否有一个用于十进制数字的POSIX char类。