将特定行转换为列

将特定行转换为列

我有数百万这样的台词。我想写一个简单的bash脚本来获取一些信息。

                            Name:                 1FJ
                        HA_RMSDs:          -1000.0000
                        HA_RMSDh:          -1000.0000
                        HA_RMSDm:              0.0000
                      Grid_Score:          -24.958729
                 Grid_vdw_energy:          -24.958729
                  Grid_es_energy:            0.000000
       Internal_energy_repulsive:            5.894002
                            Name:       ZINC103990867
                        HA_RMSDs:          -1000.0000
                        HA_RMSDh:          -1000.0000
                        HA_RMSDm:              0.0000
                      Grid_Score:          -22.196136
                 Grid_vdw_energy:          -17.917459
                  Grid_es_energy:           -4.278677
       Internal_energy_repulsive:           14.832469

我想变成这样;
Name            Grid_Score
ZINC103990867   -22.196136
1FJ             -24.958729

我找到了一些solution但我做不到。
任何帮助都是非常可观的。

最佳答案

当输入中有名称到值映射时,通常最好先创建一个包含这些映射的数组,然后按其名称打印值:

$ cat tst.awk
{ sub(/:/,"") }

NR==1 { key=$1 }
$1==key { prt() }
{ f[$1] = $2 }
END { prt() }

function prt(   i) {
    if (NR==1) {
        numCols = split(c,cols,/,/)
        for (i=1; i<=numCols; i++) {
            printf "%s%s", cols[i], (i<numCols?OFS:ORS)
        }
    }
    else {
        for (i=1; i<=numCols; i++) {
            printf "%s%s", f[cols[i]], (i<numCols?OFS:ORS)
        }
    }
}

是的。
$ awk -v c='Name,Grid_Score' -f tst.awk file | column -t
Name           Grid_Score
1FJ            -24.958729
ZINC103990867  -22.196136

是的。
$ awk -v c='Name,Grid_Score,HA_RMSDs,Grid_es_energy' -f tst.awk file | column -t
Name           Grid_Score  HA_RMSDs    Grid_es_energy
1FJ            -24.958729  -1000.0000  0.000000
ZINC103990867  -22.196136  -1000.0000  -4.278677

关于linux - 将特定行转换为列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45683662/

10-10 17:49