다음 파일이 있습니다
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
는 다음을 수행합니다.
- 해당 줄이 첫 번째 줄인 경우 줄 시작 부분의 공백을 제거하고 인쇄합니다. 그런 다음 출력 레코드 구분 기호(
ORS
)를 공백으로 변경하고 다음 줄로 이동합니다. - 다른 모든 줄의 경우 줄 번호에 해당하는 필드를 인쇄합니다. 값 때문에 데이터는 개행 문자 대신 후행 공백으로 인쇄됩니다
ORS
. - 마지막으로 개행 문자가 출력됩니다.
답변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" "
원래의 단일 문자 간격을 원하면 다음을 수행하십시오.