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)
这应该给你你想要的.
两列以上
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 中测试。
最简单的解决方案是:
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 ... 文件名