【问题标题】:Unix Command (Mac OS): cut and move rowsUnix 命令 (Mac OS):剪切和移动行
【发布时间】:2014-08-06 20:25:43
【问题描述】:
您能否给我一个提示,我可以使用哪个 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
rs和perl -pne只是转置它们,但正如你所见,我需要一个全新的安排。 Perl 代码会受到青睐,但我很感谢您的帮助。
干杯
沼泽
【问题讨论】:
标签:
macos
perl
bash
shell
unix
【解决方案1】:
使用 perl 单行代码
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】:
我用红宝石
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")
希望能帮到你:)
【解决方案3】:
我会选择来自coreutils 的split 和paste。尝试以下命令:
split -l3 infile
paste -d' ' xaa xab xac | column -t
输出:
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
【解决方案4】:
这是一个单线:
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