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

Posted

技术标签:

【中文标题】如何从命令行反转 Linux 中文件的列顺序【英文标题】:How to reverse column order of a file in Linux from the command line 【发布时间】:2010-11-16 17:05:36 【问题描述】:

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

IP1  <TAB>  Server1
IP2  <TAB>  Server2

我想制作:

Server1  <TAB>  IP1
Server2  <TAB>  IP2

最优雅、最短的 Linux 命令行工具是什么?

【问题讨论】:

哪个平台?视窗,Unix,最大。 . . 【参考方案1】:

多于两列

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 中测试。

【讨论】:

【参考方案2】:

最简单的解决方案是:

awk '打印 $2 "\t" $1'

但是,存在一些问题。如果任一字段中可能有空格,您需要执行以下操作之一:(取决于您的 awk 是否支持 -v)

awk -v FS='\t' '打印 $2 "\t" $1' awk 'BEGIN FS="\t" 打印 $2 "\t" $1'

或者,您可以执行以下操作之一:

awk -v OFS='\t' '打印 $2,$1' awk 'BEGIN OFS="\t" 打印 $2,$1' awk -v FS='\t' -v OFS='\t' 'print $2,$1' # 如果允许字段中有空格

其中一个 cmets 问道,“文件名去哪儿了”? awk 用作过滤器,因此它通常显示为:

$ 一些命令 |啊... |其他命令

没有给出文件名。或者,可以在所有命令之后将文件名作为参数给出:

$ awk ...文件名

【讨论】:

【参考方案3】:

使用 awk:

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

这应该会给你你想要的。

【讨论】:

值得注意的是,它给出的结果是以空格分隔的,但如果需要,插入制表符转义是相当简单的。 即使在只有一列的文件上也能工作(对于脚本案例),但它会在输出中放置一个空格作为第一个字符。【参考方案4】:

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

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

第一个可能也适用于sed

【讨论】:

Perl 有一个 reverse() 函数,可以反转字符串、数组或数字,因此您只需反转拆分调用的结果,然后再次加入。

以上是关于如何从命令行反转 Linux 中文件的列顺序的主要内容,如果未能解决你的问题,请参考以下文章

如何从Linux命令行截屏

Linux统计文件行数

如何修改Linux系统服务启动顺序

Linux 如何通过命令查看一个文件的某几行(中间几行或最后几行)

sh 如何反转文件中的行顺序?

Linux如何通过命令查看日志文件的某几行(中间几行或最后几行)