重新排序列
如何与一个衬垫重新排序列
foo r1.1 abc
foo r10.1 pqr
qux r2.1 lmn
bar r33.1 xpq
# In fact there could be more fields that preceeds column with "rxx.x".
重组到这个这个
r1.1 foo abc
r10.1 foo pqr
r2.1 qux lmn
r33.1 bar xpq
基本上,把第二列到第一和其他一切成功它,之后。
假设你的文字是在文件的“测试”,这将做到这一点:
perl -lane 'print "$F[1] $F[0] $F[2]"' test
它没有chomp行。有没有办法修改你很棒的班轮? – neversaint
@neversaint它确实是chomp,除非你在非windows系统上处理windows文件,在这种情况下,你可以尝试在环境中运行'PERLIO =:unix:crlf'。 – hobbs
''$ F [1] $ F [0] $ F [2]“'更好地写成片段'”@F [1,0,2]“',特别是当有更多的字段时。 – TLP
如果你有超过三列,你会想是这样的:
perl -lane 'print join q(),$F[1],$F[0],@F[[email protected]]'
'perl -lane'print join“$ F [1] $ F [0] @F [2 .. $#F]”'''会更简单地做同样的事情。 –
@davorg:我想你的意思是没有'加入',然后,是的,我同意。 – JRFerguson
$ perl -pale '$_ = "@F[1,0,2..$#F]"' file
如果是制表符分隔,需要多一点:
$ perl -pale 'BEGIN { $"="\t"; } $_ = "@F[1,0,2..$#F]"' file
我认为你的意思是将'-a'添加到autosplit。鉴于你的解决方案比我的更好/更短。 – JRFerguson
@James_R_Ferguson:我在你提到它之前加了它;) – Zaid
+1盒子外的漂亮版本。猴子扳手:如果你有空的领域呢? – TLP
内容 '的infile' 的:
foo r1.1 abc
foo r10.1 pqr
qux r2.1 lmn
bar r33.1 xpq
Perl的单行:
perl -pe 's/\A(\S+\s+)(\S+\s+)/$2$1/' infile
结果:
r1.1 foo abc
r10.1 foo pqr
r2.1 qux lmn
r33.1 bar xpq
为什么在这个答案downvote? – TLP
基本答案是由他人提供的,我认为是固定的宽度的情况下可能为空字段的数据:
>cat spacedata.txt
foo r1.1 abc
foo r10.1 pqr
qux r2.1 lmn
bar r33.1 xpq
r1.2 cake
is r1.2 alie
>perl -lpwE '$_=pack "A7A5A*", (unpack "A5A7A*")[1,0,2];' spacedata.txt
r1.1 foo abc
r10.1 foo pqr
r2.1 qux lmn
r33.1 bar xpq
r1.2 cake
r1.2 is alie
file
a 5 ss
b 3 ff
c 2 zz
cat file | awk '{print $2, $1, $3}' # will print column 2,1,3
5 a ss
3 b ff
2 c zz
#or if you want to sort by column and print to new_file
cat file | sort -n -k2 | awk '{print $0}' > new_file
new_file
c 2 zz
b 3 ff
a 5 ss
为什么它必须是单线? –
@JB:它不一定是,但为什么复杂的生活可能很简单? – Zaid
@Zaid:我的观点是:单行程往往更短,并不简单。 –