如何将一系列数字重复到列的末尾?
我有一个数据文件,需要从1到5的标识符的新列。最终目的是将数据拆分成五个单独的文件,没有剩余文件(拆分留下剩余文件)。如何将一系列数字重复到列的末尾?
数据:
aa
bb
cc
dd
ff
nn
ww
tt
pp
与标识列:
aa 1
bb 2
cc 3
dd 4
ff 5
nn 1
ww 2
tt 3
pp 4
不知道这是否可以被SEQ做什么?之后它会与分裂:
awk '$2 == 1 {print $0}'
awk '$2 == 2 {print $0}'
awk '$2 == 3 {print $0}'
awk '$2 == 4 {print $0}'
awk '$2 == 5 {print $0}'
$ awk '{print $0, ((NR-1)%5)+1}' file
aa 1
bb 2
cc 3
dd 4
ff 5
nn 1
ww 2
tt 3
pp 4
的空间
当然不需要创建5个单独的文件。所有你需要的是:
awk '{print > ("file_" ((NR-1)%5)+1)}' file
看起来你很高兴与输出的1-5
1-4
然后0
,而不是一个Perl的解决方案,因此仅供参考这里是在awk中的等价物:
$ awk '{print $0, NR%5}' file
aa 1
bb 2
cc 3
dd 4
ff 0
nn 1
ww 2
tt 3
pp 4
这也适用。谢谢! –
Perl来救援:
perl -pe 's/$/" " . $. % 5/e' <input> output
使用0而不是5
-
$.
是行号。 -
%
是模运算符。 - 的
/e
改性剂告诉替代给替换部分作为代码评估
即线的端部($
)被替换为级联(.
)与行号取模5.
完美无瑕的胜利。非常感激。 –
不错,超级优雅 –
我要报价一个Perl解决方案,即使它没有被标记,因为Perl非常适合解决这个问题。
如果我知道你想做什么,你必须要基于在数据文件中的行的位置分割成5个独立文件的单个文件:
the first line in the data file goes to file 1
the second line in the data file goes to file 2
the third line in the data file goes to file 3
...
既然你已经有了在文件中的行位置,你并不需要标识符列(尽管如果你想要的话,你可以追求解决方案)。
相反,你可以打开5个句柄和简单地替代它处理你写:
use strict;
use warnings;
my $datafilename = shift @ARGV;
# open filehandles and store them in an array
my @fhs;
foreach my $i (0 .. 4) {
open my $fh, '>', "${datafilename}_$i"
or die "$!";
$fhs[$i] = $fh;
}
# open the datafile
open my $datafile_fh, '<', $datafilename
or die "$!";
my $row_number = 0;
while (my $datarow = <$datafile_fh>) {
print { $fhs[$row_number++ % @fhs] } $datarow;
}
# close resources
foreach my $fh (@fhs) {
close $fh;
}
使用一些VIM脚本魔法 – deathangel908