私は単に列と次のデータを印刷したいと$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
使用awk
とdatamash
:
$ 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