使用正则表达式修改文本文件(awk?)

时间:2011-03-11 19:33:28

标签: regex sed awk text-files

我有一个文本文件,格式如下:

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 个答案:

答案 0 :(得分:3)

使用awk(假设您的输入位于file.txt且结果位于stdout上):

awk '
/^line/ {number = $2}
/^[0-9]/ {print $0, number}
' file.txt

答案 1 :(得分:3)

在Perl中你可以这样做:

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

Ideone Link

答案 2 :(得分:1)

$ awk '$0 == "" {}
       $1 == "line" {line = $2}
       {print %0, line}' infile >outfile

答案 3 :(得分:1)

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

答案 4 :(得分: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