随机播放列

时间:2014-11-16 09:22:47

标签: bash

bash中重新排序列的最佳方法是什么?

真实的例子:

我有文件ONE.txt包含:

firstName secondName telNumber

我想从第一个文件

创建文件SECOND.txt
secondName firstName telNubmer

我怎样才能做到这一点? (仅交换列一行)

2 个答案:

答案 0 :(得分:8)

使用awk。

awk '{print $2,$1,$3}' infile > outfile

答案 1 :(得分:2)

只是为了好玩,这里有一个与Avinash Raj的awk命令(几乎)相同的sed解决方案。

sed 's/[[:space:]]*\([^[:space:]]*\)[[:space:]]*\([^[:space:]]*\)[[:space:]]*/\2 \1 /' infile > outfile

显然,awk解决方案很多更容易阅读。 :) OTOH,sed版本可以处理超过3个字段的行。

如果我们可以保证总是

firstName secondName telNumber

没有额外的空格或其他空格(例如制表符),我们可以将sed命令压缩为:

sed 's/\([^ ]*\) \([^ ]*\)/\2 \1/'

我刚刚对包含500,000行(使用awk生成)的文件进行了快速计时测试。浓缩的sed版本比awk版本慢10倍。我猜测它会慢一点,因为sed正在使用正则表达式,但我认为 要慢得多。

FWIW,相当于Avinash Raj的awk命令的Python相当于awk版本的两倍。


我刚刚重新阅读了这个问题。 出现 OP中的文件只有一行数据。 在这种情况下,我们可以使用纯bash非常简单地执行此操作:

read a b c < ONE.txt;echo > SECOND.txt "$b $a $c"

也许 tilefrae说他们只希望交换发生在第一行,并制作后续行的简单副本......如果是这样,很容易修改awk或sed程序来做到这一点。