Как повторить последовательность чисел до конца столбца?

У меня есть файл данных, для которого требуется новый столбец идентификаторов от 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}' 

person Justin Buchanan    schedule 10.07.2015    source источник
comment
Используйте немного магии сценариев vim   -  person deathangel908    schedule 10.07.2015


Ответы (3)


$ 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, так что, к вашему сведению, вот эквивалент в 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
person Ed Morton    schedule 10.07.2015

Перл в помощь:

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

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

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

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

person choroba    schedule 10.07.2015
comment
Безупречная победа. Очень признателен. - person Justin Buchanan; 10.07.2015

Я собираюсь предложить 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; 
}
person Hunter McMillen    schedule 10.07.2015