Объединение нескольких строк с дискриминатором - PullRequest
1 голос
/ 08 февраля 2010

У меня есть такой ввод

Введите:

a,b,c
d,e,f
g,h,i
k,l,m
n,o,p
q,r,s

Я хочу иметь возможность объединять строки с помощью дискриминатора типа "|"

Выход:

a,b,c|d,e,f|g,h,i 
k,l,m|n,o.p|q,r,s

Файл содержит 1 миллион строк, и я хочу иметь возможность объединять строки, как в предыдущем примере.

Есть идеи о том, как подойти к этому?

Ответы [ 5 ]

2 голосов
/ 08 февраля 2010

Поскольку ваши теги включают sed, вот способ использовать его:

sed 'N;N;s/\n/|/g' datafile
2 голосов
/ 08 февраля 2010

@ OP, если вы хотите сгруппировать их для каждых 3 записей,

$ awk 'ORS=(NR%3==0)?"\n":"|"' file
a,b,c|d,e,f|g,h,i
k,l,m|n,o,p|q,r,s

с Perl,

$ perl -lne 'print $_ if $\ = ($. % 3 == 0) ? "\n" : "|"' file
a,b,c|d,e,f|g,h,i
k,l,m|n,o,p|q,r,s
0 голосов
/ 08 февраля 2010

Если Perl в порядке, вы можете попробовать:

$i = 1;
while(<>) {
        chomp;
        unless($i % 3)
        { print "$line\n"; $i = 1; $line = "";}
        $line .= "$_|";
        $i++;
}

для запуска:

perl perlfile.pl 1millionlinesfile.txt
0 голосов
/ 08 февраля 2010
$ paste -sd'|' input | sed -re 's/([^|]+\|[^|]+\|[^|]+)\|/\1\n/g'

С paste мы соединяем строки вместе, а затем sed увеличиваем их. Шаблон захватывает три поля, оканчивающиеся на трубу, и заменяет их соответствующие конечные трубы новыми строками.

С Perl:

#! /usr/bin/perl -ln

push @a => $_;
if (@a == 3) {
  print join "|" => @a;
  @a = ();
}

END { print join "|" => @a if @a }
0 голосов
/ 08 февраля 2010

простак:

BEGIN {
  state=0
}

state==0 {
  line=$0
  state=1
  next
}

state==1 {
  line=line "|" $0
  state=2
  next
}

state==2 {
  print line "|" $0
  state=0
  next
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...