
次のファイル(Linux.txt)があります。
linux-test01 linuxER
LinuxCV LinuxWE LinuxPL
LinuxDF LinuxXC LinuxSD LinuxAQ
次の出力を生成するためにawkまたはperl one-linerを使用して印刷する方法(出力は新しいファイル - LinuxNewOrder.txtにあります)
linux-test01
LinuxCV
LinuxDF
linuxER
LinuxWE
LinuxXC
LinuxPL
LinuxSD
LinuxAQ
したがって、2番目の列は最初の列の後にあり、3番目の列は2番目の列の後に続く式です。
答え1
awk
そして次の組み合わせを使用してくださいgrep
。
awk -v RS=" " '{print}' Linux.txt | grep . > LinuxNewOrder.txt
より簡単な方法は以下を使用してくださいxargs
。
xargs -n 1 < Linux.txt > LinuxNewOrder.txt
答え2
単にawkを使用して入力の最初の列を印刷してから、2番目の列を印刷します。
awk '{ for (i = 1; i <= NF; i++) a[i] = a[i] "\n" $i }
END { for (i in a) print substr(a[i], 2) }' Linux.txt
配列を使用すると、列ごとa
にi
フィールド$i
がにリンクされますa[i]
。入力が終わると、a[i]
全列 i が含まれます。最後に$ 1 `を省略し、列を順番に印刷します"\n" which was stuffed in before
。
答え3
awkインデックス印刷フィールドに対して列ごとに繰り返すことができます。
for i in $(seq $(awk '{print NF}' linux.txt | sort -nu | tail -n 1)); do awk -v field=$i '{print $field}' linux.txt | grep -v "^$"; done > LinuxNewOrder.txt
$ cat LinuxNeworder.txt
linux-test01
LinuxCV
LinuxDF
linuxER
LinuxWE
LinuxXC
LinuxPL
LinuxSD
LinuxAQ
さらなる説明:
awk '{print NF}' linux.txt | sort -nu | tail -n 1
:最大列数を取得awk -v field=$i '{print $field}' linux.txt
i
:bash 変数を列インデックスとして使用して、列ごとに印刷します。grep -v "^$"
: 空のフィールドを削除