如何将一系列数字重复到列的末尾?

时间:2015-07-10 19:55:52

标签: perl awk sed seq

我有一个数据文件,需要一个新的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}' 

3 个答案:

答案 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; 
}