linux + 将文件格式列转换为一列

linux + 将文件格式列转换为一列

我有以下文件(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

因此第二列将在第一列之后,第三列将在第二列之后,依此类推。

答案1

使用awk和的组合grep

awk -v RS=" " '{print}' Linux.txt | grep . > LinuxNewOrder.txt

更简单的一种,使用xargs

xargs -n 1 < Linux.txt > LinuxNewOrder.txt

答案2

只需使用 awk,打印输入的第一列,然后打印第二列,...

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

使用 array a,对于每一列,i字段$i都连接到a[i].在输入的末尾,a[i]包含完整的列 i。最后按顺序打印列,省略"\n" which was stuffed in before$1`。

答案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 "^$":删除空字段

相关内容