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 { 印刷 sprintf("%-20s %- 10d %-10d %-10d",$0,x,y,d) }' YourInputFile

例と異なる場合は、行番号と形式を調整する必要があります。

答え2

OP投稿の直接コピー - 貼り付けを使用し、ファイルごとにヘッダーが1つだけ設定されているとします。

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数値の場合はtrue $2+0、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

関連情報