2015-07-10 48 views
0

我有一个数据文件,需要从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

使用一些VIM脚本魔法 – deathangel908

回答

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 

看起来你很高兴与输出的1-51-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 
+1

这也适用。谢谢! –

3

Perl来救援:

perl -pe 's/$/" " . $. % 5/e' <input> output 

使用0而不是5

  • $.是行号。
  • %是模运算符。
  • /e改性剂告诉替代给替换部分作为代码评估

即线的端部($)被替换为级联(.)与行号取模5.

+0

完美无瑕的胜利。非常感激。 –

+0

不错,超级优雅 –

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; 
} 
相关问题