如何从命令行反转 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 中文件的列顺序的主要内容,如果未能解决你的问题,请参考以下文章