Как вынуть некоторые новые строки документа - PullRequest
1 голос
/ 29 июня 2010

Во-первых, я действительно новичок в этом, и у меня возникают трудности ...

У меня есть эти данные:

[05/Apr/2010:09:59:34 -0300] /~bcc/topo-zero.html 200 238

         2

[05/Apr/2010:10:01:19 -0300] /~bsi/materiais/ed/u6.html 200 286960

         3

[05/Apr/2010:10:04:56 -0300] /~firedo/AISG/AISGroupContributions.html 200 33193

         2

[05/Apr/2010:10:08:33 -0300] /~bcc/topo-zero.html 200 238
         2

И я хочу, чтобы это стало так:

[05/Apr/2010:09:59:34 -0300] /~bcc/topo-zero.html 200 238 2

[05/Apr/2010:10:01:19 -0300] /~bsi/materiais/ed/u6.html 200 286960 3

[05/Apr/2010:10:04:56 -0300] /~firedo/AISG/AISGroupContributions.html 200 33193 2

[05/Apr/2010:10:08:33 -0300] /~bcc/topo-zero.html 200 238 2

Буду признателен, если кто-нибудь сможет дать мне решение для этого с помощью команды linux ...

Ответы [ 5 ]

1 голос
/ 29 июня 2010
 cat data | tr -s ' \n' | sed 'N;s/\n//g'

То есть, передайте файл от data до tr, сжимая несколько пробелов и символов новой строки. Результат этого передается через sed, объединяя чередующиеся строки с символом новой строки между ними (команда N) и затем удаляя эти символы новой строки (команда s)

0 голосов
/ 29 июня 2010
$ awk 'BEGIN{RS="[";FS="\n"}{$1=$1}NR>1{print "["$0}' OFS="" file
[05/Apr/2010:09:59:34 -0300] /~bcc/topo-zero.html 200 238         2
[05/Apr/2010:10:01:19 -0300] /~bsi/materiais/ed/u6.html 200 286960         3
[05/Apr/2010:10:04:56 -0300] /~firedo/AISG/AISGroupContributions.html 200 33193         2
[05/Apr/2010:10:08:33 -0300] /~bcc/topo-zero.html 200 238         2
0 голосов
/ 29 июня 2010

Стандартные инструменты UNIX (например, sed), по моему мнению, являются недостатком в обработке новых строк.Они предназначены для работы построчно, и может быть довольно сложно сделать такие вещи, как объединение разных строк ввода в одну строку вывода.Может быть, кто-то с более sed опытом, чем я, мог бы сделать это ... но я бы предложил вместо этого попробовать Perl, если у вас есть доступ к нему.

perl -e 'while (<>) { length || cont; chomp; s/^\s+(\d+)$/ \1\n/; print; }' inputfile.txt

Если вы хотите оставить лишний пробелСтрока между записями, точно так же, как она была отформатирована в вашем вопросе, просто измените \n на \n\n (чтобы печатать две строки после каждой записи журнала вместо одной).

0 голосов
/ 29 июня 2010

Я всегда нахожу эти маленькие сценарии легче для понимания, если я помещаю их в файл с форматированием.Следующий скрипт awk, кажется, производит желаемый результат.Этот скрипт awk просто ищет строки, которые начинаются с квадратной скобки и также имеют закрывающую скобку.Когда он встречает строку с одной цифрой, он печатает сохраненную строку с цифрой.

/^\[.*\]/{
      p = $0;
}

/^ *[0-9] *$/ {
   printf( "%s %s\n\n", p, $1 );
}

Если вы поместите вышеупомянутое в файл, такой как tmp.awk, то эта команда должна произвести пример вывода:

awk -f tmp.awk origfile.txt > newfile.txt
0 голосов
/ 29 июня 2010

cat blabla | grep 0300 | cut -f1,2,3,4,5

...