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

Ada*_*tan 11 csv command-line parsing

我有一个名为ip-list两列的文件:

IP1  <TAB>  Server1
IP2  <TAB>  Server2
Run Code Online (Sandbox Code Playgroud)

我想生产:

Server1  <TAB>  IP1
Server2  <TAB>  IP2
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*ott 14

使用awk:

awk '{print $2,$1}' ip-list
Run Code Online (Sandbox Code Playgroud)

这应该给你你想要的.

  • 值得注意的是,它将结果以空格分隔,但如果需要,可以插入选项卡转义,这是相当简单的. (2认同)

Cir*_*四事件 6

两列以上

printf "\
1 2 3 4
5 6 7 8
" | awk '{for(i=NF;i>1;i--)printf "%s ",$i;printf "%s",$1;print ""}'
Run Code Online (Sandbox Code Playgroud)

输出:

4 3 2 1
8 7 6 5
Run Code Online (Sandbox Code Playgroud)

也可以看看: https //unix.stackexchange.com/questions/46275/swapping-an-unlimited-number-of-columns

在 GNU Awk 4.0.1 中测试。


Wil*_*ell 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 | 啊... | 其他-cmd

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

$ awk ... 文件名