2011-03-11 66 views
1

我有以下格式文本文件里:使用正则表达式修改文本文件里(?AWK)

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 

我需要做的就是删除blanklines,以及各数字之间的每块“行XXX“行,连接XXX。然后,删除以“行”开始的每一行。为了清楚起见,这里是所需的输出文件的一个例子:

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 
+0

感谢大家的多样和良好的反应。选择第一个张贴的工作:) upvoted其余 – 2011-03-12 19:23:31

回答

3

随着awk(假设你的输入是file.txt,其结果是在标准输出):

awk ' 
/^line/ {number = $2} 
/^[0-9]/ {print $0, number} 
' file.txt 
1
$ awk '$0 == "" {} 
     $1 == "line" {line = $2} 
     {print %0, line}' infile >outfile 
3

在Perl你可以这样做:

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

Ideone Link

+0

提示,以上单线短期欢迎:) – codaddict 2011-03-11 19:48:11

+0

perl -nle'/^line(\ d +)/?$ l = $ 1:/^\ d /?打印“$ _ $ l”:1'文件。更短,但不确定这有多大贡献。 – 2011-03-11 22:26:34

1

桑达可能不是这项工作的最佳工具,但

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
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