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

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

IP1  <TAB>  Server1
IP2  <TAB>  Server2

我想制作:

Server1  <TAB>  IP1
Server2  <TAB>  IP2

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

【问题讨论】:

  • 哪个平台?视窗,Unix,最大。 . .

标签: parsing command-line csv


【解决方案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() 函数,可以反转字符串、数组或数字,因此您只需反转拆分调用的结果,然后再次加入。
      猜你喜欢
      • 2010-10-19
      • 2014-03-23
      • 2013-10-23
      • 1970-01-01
      • 1970-01-01
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      相关资源
      最近更新 更多