2015-07-10 4 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

Использование некоторых ВИМ был волшебный – 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 

Похоже, ты счастлив с 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 
+1

Это тоже работает. Благодаря! –

3

Perl на помощь:

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

Использует 0 вместо 5.

  • $. номер строки.
  • % является оператором modulo.
  • модификатор /e говорит о замене, чтобы оценить, как сменную часть кода

т.е. конец строки ($) заменяется пробелом сцепленного (.) с номером строки по модулю 5.

+0

Flawless победы. Очень признателен. –

+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; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^