awkを使用して2つの列を順番に印刷する

awkを使用して2つの列を順番に印刷する

私は単に列と次のデータを印刷したいと$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}' 

しかし、これは明らかにそれらを1つずつ印刷して、すべて一緒に混ぜることです。

よりよく理解し、いたずらするために努力していますawk。ご了承ください。

答え1

AFAIK、この値を保存してブロック$NFとして印刷する必要がありますEND

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

または、ファイルに対して2回のパスを実行します。

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

関連情報