awk를 사용하여 두 개의 열을 순서대로 인쇄

awk를 사용하여 두 개의 열을 순서대로 인쇄

나는 단순히 열과 다음 데이터를 인쇄하려고 $4합니다 $NF.

       000   0     00    NUL '\0' (null character)   100   64    40    @
       001   1     01    SOH (start of heading)      101   65    41    A
       002   2     02    STX (start of text)         102   66    42    B
       003   3     03    ETX (end of text)           103   67    43    C
       004   4     04    EOT (end of transmission)   104   68    44    D
       005   5     05    ENQ (enquiry)               105   69    45    E
       006   6     06    ACK (acknowledge)           106   70    46    F
       007   7     07    BEL '\a' (bell)             107   71    47    G
       010   8     08    BS  '\b' (backspace)        110   72    48    H

이렇게 하면 다음과 같은 결과를 얻을 수 있습니다.

NUL
SOH
STX
ETX
EOT
ENQ
ACK
BEL
BS
@
A
B
C
D
E
F
G
H

첫 번째 작업이 완료될 때 까지 awk기다린 후 다음 열의 인쇄를 수행합니다.

나는 시도했다:

awk '{print $4} {print $NF}' 

그러나 이는 분명히 그것들을 하나씩 인쇄하여 모두 함께 혼합하는 것입니다.

더 잘 이해하고 장난치기 위해 노력 중입니다 awk. 양해해 주시기 바랍니다.

답변1

AFAIK, 이 값을 저장 하고 블록 $NF으로 인쇄 해야 합니다END

awk '{a[NR] = $NF; print $4} END{for(i=1;i<=NR;i++) print a[i]}' file

또는 파일에 대해 두 번의 패스를 수행합니다.

awk 'NR==FNR {print $4; next} {print $NF}' file file

답변2

@steeldriver는 awk에서 이 작업을 완전히 수행하는 방법을 보여 주었습니다. 이 특정 질문에 필요한 것 이상이지만 매우 유용한 것도 고려하십시오.장식-정렬-비장식 관용구다음과 같은 질문의 경우:

$ awk -v OFS='\t' '{print 1, NR, $4 ORS 2, NR, $NF}' file | sort -nk1,2 | cut -f3-
NUL
SOH
STX
ETX
EOT
ENQ
ACK
BEL
BS
@
A
B
C
D
E
F
G
H

sorted_in다음과 같이 GNU awk에서 정확히 유사한 것을(배열의 배열 합에 대해) 구현할 수 있습니다 .

$ awk '
    { a[1][NR]=$4; a[2][NR]=$NF }
    END {
        PROCINFO["sorted_in"] = "@ind_num_asc"
        for (i in a) for (j in a[i]) print a[i][j]
    }
' file
NUL
SOH
STX
ETX
EOT
ENQ
ACK
BEL
BS
@
A
B
C
D
E
F
G
H

답변3

사용 awk:

$ awk '{print $4; a = ((a) ? a ORS : "") $NF} END{print a}' file

@EdMorton이 제안한 더 간단하고 효율적인 접근 방식은 다음과 같습니다.

$ awk '{print $4; a=a $NF ORS} END{printf "%s", a}' file

사용 awkdatamash:

$ awk '{print $4, $NF}' file | datamash -W --output-delimiter $'\n' transpose

다음 명령의 출력은 다음과 같습니다.

$ awk '{print $4, $NF}' ex | datamash -W  transpose 
NUL     SOH     STX     ETX     EOT ENQ      ACK     BEL     BS
@       A       B       C       D     E        F     G       H

여기서 출력 값은 tab다음과 같이 구분됩니다.--output-delimiter도착하다 \n.

$ awk '{print $4, $NF}' ex | datamash -W --output-delimiter $'\n' transpose
NUL
SOH
STX
ETX
EOT
ENQ
ACK
BEL
BS
@
A
B
C
D
E
F
G
H

관련 정보