Unix Command(Mac OS):剪切和移动行

时间:2014-06-16 22:54:05

标签: macos perl bash shell unix

请你给我一个提示,我可以使用哪个unix命令来执行以下操作:

我想转换这些行...

1   a   i  
2   b   ii  
3   c   iii  
4   d   iv  
5   e   v  
6   f   vi  
7   g   vii  
8   h   viii  
9   i   xi 

...进入那些:

1   a   i   4   d   iv  7   g   vii  
2   b   ii  5   e   v   8   h   viii  
3   c   iii 6   f   vi  9   i   xi

rsperl -pne只需转置它们,但我需要一个全新的安排。 Perl代码会受到青睐,但我感谢任何帮助。

欢呼声 MARSCH

4 个答案:

答案 0 :(得分:3)

我会选择来自split的{​​{1}}和paste。请尝试以下命令:

coreutils

输出:

split -l3 infile
paste -d' ' xaa xab xac | column -t

答案 1 :(得分:3)

使用perl one-liner

perl -lne 'push @{$l[($.-1) % 3]}, $_; }{ print "@$_" for @l' data.txt | column -t

说明:

切换

  • -l:启用行结束处理,指定行终止符
  • -n:为输入文件中的每一行创建一个while(<>){..}循环。
  • -e:告诉perl在命令行上执行代码。

<强>代码

  • push @{$l[($.-1) % 3]}, $_;:将每一行推入一个以行号
  • 为模的数组
  • }{ print "@$_" for @l:在处理结束时打印3元素数组
  • | column -t:即使列
  • 也是如此

答案 2 :(得分:0)

这是一个oneliner:

perl -ne 'chomp; push @a,$_ if $_; unless($. % 3) {push @f,[@a]; @a = undef; shift @a} END {for my $i (@f) { for (@$i) {print "$_ "} print "\n"}}' filename.txt

输出

1 a i 2 b ii 3 c iii
4 d iv 5 e v 6 f vi
7 g vii 8 h viii 9 i xi

答案 3 :(得分:0)

我使用ruby

string = "1   a   i  
2   b   ii  
3   c   iii  
4   d   iv  
5   e   v  
6   f   vi  
7   g   vii  
8   h   viii  
9   i   xi "
ary = string.split("\n")
length = ary.size / 3
new_ary = Array.new(3, "")

ary.each_with_index do |e, i| 
  position = i % 3
  new_ary[position] += e
end

puts new_ary.join("\n")

希望能提供帮助:)