如何与一个衬垫重新排序列
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
基本上,把第二列到第一和其他一切成功它,之后。
如何与一个衬垫重新排序列
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:我的观点是:单行程往往更短,并不简单。 –