Изменение текстового файла с помощью регулярных выражений (awk?) - PullRequest
1 голос
/ 11 марта 2011

У меня есть текстовый файл в следующем формате:

line 450

10876 -022.6421047 -070.1866390 000882 23362.47 99 000000.00 10 202246.0 
10877 -022.6421090 -070.1866412 000882 23363.42 99 000000.00 10 202247.0 
10878 -022.6421090 -070.1866412 000882 23363.93 99 000000.00 10 202248.0 
10879 -022.6421090 -070.1866412 000882 23363.68 99 000000.00 10 202249.0 
10880 -022.6421090 -070.1866412 000882 23363.72 99 000000.00 10 202250.0

line 460

10872 -022.6420829 -070.1866339 000882 23424.83 99 000000.00 10 202242.0 
10873 -022.6420889 -070.1866373 000882 23413.99 99 000000.00 10 202243.0 
10874 -022.6420945 -070.1866378 000882 23393.97 99 000000.00 10 202244.0 
10875 -022.6421000 -070.1866369 000882 23375.70 99 000000.00 10 202245.0 

Что мне нужно сделать, это удалить пустые строки, и к каждому блоку чисел между каждой строкой «строка XXX» объединить XXX,Затем удалите каждую строку, начинающуюся с «line».Для наглядности приведен пример необходимого выходного файла:

10876 -022.6421047 -070.1866390 000882 23362.47 99 000000.00 10 202246.0 450 
10877 -022.6421090 -070.1866412 000882 23363.42 99 000000.00 10 202247.0 450
10878 -022.6421090 -070.1866412 000882 23363.93 99 000000.00 10 202248.0 450 
10879 -022.6421090 -070.1866412 000882 23363.68 99 000000.00 10 202249.0 450
10880 -022.6421090 -070.1866412 000882 23363.72 99 000000.00 10 202250.0 450
10872 -022.6420829 -070.1866339 000882 23424.83 99 000000.00 10 202242.0 460
10873 -022.6420889 -070.1866373 000882 23413.99 99 000000.00 10 202243.0 460
10874 -022.6420945 -070.1866378 000882 23393.97 99 000000.00 10 202244.0 460
10875 -022.6421000 -070.1866369 000882 23375.70 99 000000.00 10 202245.0 460

Ответы [ 5 ]

3 голосов
/ 11 марта 2011

В Perl вы можете сделать:

perl -nle 'if(/^line/){($l = $_)=~s/\D//g;}elsif(/^\d/){print "$_ $l"}' file

Ideone Link

3 голосов
/ 11 марта 2011

С awk (при условии, что ваш ввод в file.txt, а результат в stdout):

awk '
/^line/ {number = $2}
/^[0-9]/ {print $0, number}
' file.txt
1 голос
/ 12 марта 2011
awk '/line/{n=$2;next}NF{$0=$0 FS n;print $0}' file

ruby -ane 'n=$F[1] if /line/; print $_.chomp + " #{n}\n" if $F.size>0 && !/line/' file
1 голос
/ 12 марта 2011

Sed, вероятно, не лучший инструмент для этой работы, но

sed '/^$/d;/line/{s/line //;h;d;};G;s|\n||' filename

Обратите внимание, что все, кроме одной из ваших числовых строк, заканчиваются пробелом;это решение предполагает, что это была опечатка, и что все они должны.Если никто не должен, то используйте это:

sed '/^$/d;/line/{s/line //;h;d;};G;s|\n| |' filename

, и если некоторые могут, а некоторые нет, тогда используйте это безопасно:

sed '/^$/d;/line/{s/line //;h;d;};G;s| *\n| |' filename
1 голос
/ 11 марта 2011
$ awk '$0 == "" {}
       $1 == "line" {line = $2}
       {print %0, line}' infile >outfile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...