2011-11-25 230 views
2

如何与一个衬垫重新排序列

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 

基本上,把第二列到第一和其他一切成功它,之后。

+0

为什么它必须是单线? –

+1

@JB:它不一定是,但为什么复杂的生活可能很简单? – Zaid

+0

@Zaid:我的观点是:单行程往往更短,并不简单。 –

回答

4

假设你的文字是在文件的“测试”,这将做到这一点:

perl -lane 'print "$F[1] $F[0] $F[2]"' test 
+0

它没有chomp行。有没有办法修改你很棒的班轮? – neversaint

+0

@neversaint它确实是chomp,除非你在非windows系统上处理windows文件,在这种情况下,你可以尝试在环境中运行'PERLIO =:unix:crlf'。 – hobbs

+0

''$ F [1] $ F [0] $ F [2]“'更好地写成片段'”@F [1,0,2]“',特别是当有更多的字段时。 – TLP

3

如果你有超过三列,你会想是这样的:

perl -lane 'print join q(),$F[1],$F[0],@F[[email protected]]' 
+1

'perl -lane'print join“$ F [1] $ F [0] @F [2 .. $#F]”'''会更简单地做同样的事情。 –

+0

@davorg:我想你的意思是没有'加入',然后,是的,我同意。 – JRFerguson

3
$ perl -pale '$_ = "@F[1,0,2..$#F]"' file 

如果是制表符分隔,需要多一点:

$ perl -pale 'BEGIN { $"="\t"; } $_ = "@F[1,0,2..$#F]"' file 
+1

我认为你的意思是将'-a'添加到autosplit。鉴于你的解决方案比我的更好/更短。 – JRFerguson

+0

@James_R_Ferguson:我在你提到它之前加了它;) – Zaid

+0

+1盒子外的漂亮版本。猴子扳手:如果你有空的领域呢? – TLP

2

内容 '的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 
+0

为什么在这个答案downvote? – TLP

2

基本答案是由他人提供的,我认为是固定的宽度的情况下可能为空字段的数据:

>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 
1
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