如何在Linux命令行中反转文件的列顺序

15

我有一个名为ip-list的文件,其中包含两列:

IP1  <TAB>  Server1
IP2  <TAB>  Server2

我想要生成:

Server1  <TAB>  IP1
Server2  <TAB>  IP2

什么是最优雅、最简短的Linux命令行工具来完成它?


哪个平台?Windows,Unix,Max... - Binary Worrier
4个回答

20

使用awk:

awk '{print $2,$1}' ip-list

那应该能给你想要的东西。


3
值得注意的是,它给出的结果是以空格为分隔符的,但如果需要,插入制表符转义字符相当简单。 - Chris Scott
1
即使是处理只有一列的文件(例如脚本),它也能正常工作,但输出时会在第一个字符前加上一个空格。 - Sopalajo de Arrierez

7

5
最简单的解决方案是:
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

1

perl -pi -e 's/^([^\t]+)\t([^\t]+)$/\2\t\1/' yourfile.csv

perl -pi -e 'split("\t"); print "$_[1]\t$_[0]"'

第一个命令在 sed 上也可能有效。


Perl有一个reverse()函数,可以反转字符串、数组或数字,因此您只需反转split调用的结果,然后再次进行连接即可。 - Michael V. Pelletier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接