我有数百万这样的台词。我想写一个简单的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/