AWK 如何从标题中获取值并将其打印在列中?

AWK 如何从标题中获取值并将其打印在列中?

我必须从 txt 文件的标题中获取一些值,并将它们复制为行数随文件变化的列,这是一个示例。

输入文件:

PROJECT : PRK33
X_COR : 258524
Y_COR : 225898
DATUM : 874

DEPTH   TIME

0        0
1        7
2        16
3        20

输出文件:

0        0    258524 225898 874
1        7    258524 225898 874
2        16   258524 225898 874
3        20   258524 225898 874

答案1

这是一种可能的简单方法,基于标题与您提供的完全相同并且数据从第 8 行开始的假设

  1. 匹配感兴趣的标题行,保留其值
  2. 从第一个数据行开始,使用一些漂亮的格式将值附加到输出

    awk -F":" '/^X_COR/ { x=$2 } ; /^Y_COR/ { y=$2 } ; /^DATUM/ { d=$2 } ;NR>7 { print sprintf("%-20s %-10d %-10d %-10d",$0,x,y,d) }' YourInputFile

如果行号和格式与您的示例不同,您可能需要调整行号和格式

答案2

使用 OP 帖子的直接复制粘贴并假设每个文件仅设置一个标头

awk -F":" '$2+0{a=a"\t"$2}$1~/[^0-9. ]+$/{print $0a}' file1

0        0       258524  225898  874
1        7       258524  225898  874
2        16      258524  225898  874
3        20      258524  225898  874

打断:

如果$2是数字,$2+0为 true,则它是 x、y 或 z,因此将其组合成字符串

否则,如果$1包含数字,$1~/^[0-9. ]+$/则它是数据,因此打印它加上组成的字符串

答案3

$ awk 'NR>1 && NR<5{h=h OFS $NF} NR>7{print $0 h}' file
0        0 258524 225898 874
1        7 258524 225898 874
2        16 258524 225898 874
3        20 258524 225898 874

或者这可能更像是您想要做的,例如,如果标头可以采用不同的输入顺序,但您想强制执行特定的输出顺序:

$ awk '/:/{f[$1]=$NF} NR>7{print $0, f["X_COR"], f["Y_COR"], f["DATUM"]}' file
0        0 258524 225898 874
1        7 258524 225898 874
2        16 258524 225898 874
3        20 258524 225898 874

相关内容