linux +ファイル形式の列を1つの列に変換

linux +ファイル形式の列を1つの列に変換

次のファイル(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

配列を使用すると、列ごとaiフィールド$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.txti:bash 変数を列インデックスとして使用して、列ごとに印刷します。
  • grep -v "^$": 空のフィールドを削除

関連情報