我有一个数据文件,需要一个新的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}'
答案 0 :(得分:3)
Perl救援:
perl -pe 's/$/" " . $. % 5/e' < input > output
使用0代替5。
$.
是行号。%
是模运算符。/e
修饰符告诉替换将替换部分评估为代码即。行尾($
)替换为连接的空格(.
),行号为5。
答案 1 :(得分:1)
$ 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
您似乎对perl解决方案感到满意,该解决方案输出1-4
然后0
而不是1-5
,所以这里的FYI与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
答案 2 :(得分:1)
我将提供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;
}