파일에서 동일한 헤더 행과 열에 해당하는 값을 추출하는 방법은 무엇입니까?

파일에서 동일한 헤더 행과 열에 해당하는 값을 추출하는 방법은 무엇입니까?

다음 파일이 있습니다

    1 2 3 4 5 
1   a b c d e
2   f g h i j
3   k l m n o
4   p k r s t
5   w x w z #

위치 1,1 - 2,2 - 3,3 - 4,4 및 5,5에 해당하는 값을 추출하고 싶습니다.

즉, 원하는 출력

1 2 3 4 5
a g m s # 

답변1

$ awk 'FNR == 1 { sub("^ *", ""); print; ORS=" "; next } { print $FNR } END { printf("\n") }' file
1 2 3 4 5
a g m s #

코드 awk는 다음을 수행합니다.

  1. 해당 줄이 첫 번째 줄인 경우 줄 시작 부분의 공백을 제거하고 인쇄합니다. 그런 다음 출력 레코드 구분 기호( ORS)를 공백으로 변경하고 다음 줄로 이동합니다.
  2. 다른 모든 줄의 경우 줄 번호에 해당하는 필드를 인쇄합니다. 값 때문에 데이터는 개행 문자 대신 후행 공백으로 인쇄됩니다 ORS.
  3. 마지막으로 개행 문자가 출력됩니다.

답변2

열이나 행이 정렬되지 않았거나 키워드에 의존하는 경우:

awk 'BEGIN {IFS=" +"} 
     NR==1 {for ( i=1 ; i<=NF ; i++ ) { ihead[$i]=i+1 }
     NR>1 { print $1,$ihead[$1] }' file

file
    5 2 1 4 3 
4   a b c d e
1   f g h i j
2   k l m n o
5   p k r s t
3   w x w z #

result
4 d
1 h
2 l
5 p
3 #

이를 sort정렬 출력으로 파이프합니다. 요구 사항에 맞게 형식을 조정하려면 파이프 datamash -t' ' transpose(정렬된 출력을 위해 사전 실행 sort)하거나 더 큰 방식으로 진행할 수 있습니다.

awk 'BEGIN {IFS=" +"} 
     NR==1 {for ( i=1 ; i<=NF ; i++ ) { ihead[$i]=i+1 ; head[$i]=$i }
     NR>1 { result[$1]=$ihead[$1] }
     END { for (a in head) printf head[a]" "
           printf "\n"
           for (a in head) printf result[a]" "}' file

후자의 awk경우( ) 결과도 정렬됩니다(요소별, 영숫자순).머리):

1 2 3 4 5 
h l # d p 

답변3

파일의 열과 행 인덱스는 연속된 숫자이므로 자연 오프셋을 사용할 수 있습니다.행 인덱스 --> 열 인덱스로:

$ awk 'NR == 1{ sub(/^ +/, ""); print; next }
      { sep= NR!=NF? FS:ORS; printf "%s%s", $NR, sep }' file
1 2 3 4 5
a g m s #

답변4

아니면 그냥

awk 'NR==1{print};NR>1 {printf $NR" "}' file | column -t

산출

1  2  3  4  5
a  g  m  s  #

column -t -o" "원래의 단일 문자 간격을 원하면 다음을 수행하십시오.

관련 정보