在bash
中重新排序列的最佳方法是什么?
真实的例子:
我有文件ONE.txt包含:
firstName secondName telNumber
我想从第一个文件
创建文件SECOND.txtsecondName firstName telNubmer
我怎样才能做到这一点? (仅交换列一行)
答案 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程序来做到这一点。