重新格式化行

时间:2019-05-10 01:30:48

标签: awk sed

我有几行看起来像这样,

[206, 40, 200] 3.588939213064659e-06
[206, 40, 58, 200] 1.0137134449402395e-05
[206, 200] 1.2268187790002155e-05
[206, 38, 200] 3.2630262623982875e-05
[206, 40, 38, 200] 3.273281423485983e-05
[206, 40, 58, 38, 200] 3.341643719910475e-05

有没有一种有效的方法可以使用sed / awk将它们转换为以下内容?

206 40 200
206 40 58 200
206 200
206 38 200
206 40 38 200 
206 40 58 38 200

还有这个

206 40 200 0.000003588939213064659
206 40 58 200 0.000010137134449402395
206 200 0.000012268187790002155
206 38 200 0.000032630262623982875
206 40 38 200 0.00003273281423485983
206 40 58 38 200 0.00003341643719910475

谢谢!

3 个答案:

答案 0 :(得分:1)

您只需要一个正则表达式字段分隔符并将格式转换为变量。

$ awk -F'[][, ]+' '$NF=sprintf("%.21f",$NF)' file

编辑:简单的是awk -F'[][, ]+' '{$NF=""}1'

答案 1 :(得分:0)

对于第一个问题,请尝试以下。

awk 'match($0,/\[.*\]/){val=substr($0,RSTART+1,RLENGTH-2);gsub(","," ",val);print val}'  Input_file

对于您的第二个问题,请您试一试。

awk 'match($0,/\[.*\]/){val=substr($0,RSTART+1,RLENGTH-2);gsub(","," ",val);printf("%s %.21f\n",val,$NF)}'  Input_file

答案 2 :(得分:0)

回答后一个要求,请尝试:

foo <- function(x, n.x, long, nn, rowName = "character") {

        nn <- if(rowName == "character") {
                  nn
                 } else as.integer(factor(nn))


        d1 <- data.frame(a = x, long)
        row.names(d1) <- nn

        lst1 <- split(d1, list(rep(seq_along(n.x), n.x), long), drop = TRUE)
        names(lst1) <- paste0("Study", seq_along(lst1))
        #lst1 <- lapply(lst1, `row.names<-`, NULL)
        lapply(lst1, function(x) 
             setNames(x, c("a", c("short", "long")[x$long[1] +1])))

       } 

nn <- c("bigi, gigi, cigi", "fifi") 
nn1 <- unlist(strsplit(nn, ", "))
foo(1:4, c(1, 2, 1), c(TRUE, FALSE, TRUE, TRUE), nn1, rowName = "integer")