我有一个名为ip-list
的文件,其中包含两列:
IP1 <TAB> Server1
IP2 <TAB> Server2
我想要生成:
Server1 <TAB> IP1
Server2 <TAB> IP2
什么是最优雅、最简短的Linux命令行工具来完成它?
我有一个名为ip-list
的文件,其中包含两列:
IP1 <TAB> Server1
IP2 <TAB> Server2
我想要生成:
Server1 <TAB> IP1
Server2 <TAB> IP2
什么是最优雅、最简短的Linux命令行工具来完成它?
使用awk:
awk '{print $2,$1}' ip-list
那应该能给你想要的东西。
超过两列
printf "\
1 2 3 4
5 6 7 8
" | awk '{for(i=NF;i>1;i--)printf "%s ",$i;printf "%s",$1;print ""}'
输出:
4 3 2 1
8 7 6 5
相关链接: https://unix.stackexchange.com/questions/46275/swapping-an-unlimited-number-of-columns
在GNU Awk 4.0.1中测试通过。
awk '{print $2 "\t" $1}'然而,有些问题。如果字段中可能存在空格,则需要执行以下操作之一:(取决于awk是否支持-v)
awk -v FS='\t' '{print $2 "\t" $1}' awk 'BEGIN{ FS="\t" } {print $2 "\t" $1}'或者,你可以执行以下操作之一:
awk -v OFS='\t' '{print $2,$1}' awk 'BEGIN{ OFS="\t" } {print $2,$1}' awk -v FS='\t' -v OFS='\t' '{print $2,$1}' # 如果允许字段中包含空格其中一个评论问:“文件名在哪里”?awk用作过滤器,因此通常会出现如下所示的形式:
$ some-cmd | awk ... | other-cmd没有给出文件名。或者,在所有命令之后可以给出文件名作为参数:
$ awk ... filename
perl -pi -e 's/^([^\t]+)\t([^\t]+)$/\2\t\1/' yourfile.csv
perl -pi -e 'split("\t"); print "$_[1]\t$_[0]"'
第一个命令在 sed
上也可能有效。