我有以下文件(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.txt
i
:使用bash 变量作为列索引逐列打印grep -v "^$"
:删除空字段