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 게시물의 직접 복사-붙여넣기를 사용하고 파일당 헤더가 하나만 설정되어 있다고 가정합니다.

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+0x, 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

관련 정보