我必须从 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 行开始的假设
- 匹配感兴趣的标题行,保留其值
从第一个数据行开始,使用一些漂亮的格式将值附加到输出
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