用于从除最后一行之外的单词开始删除所有/ n行数的脚本

时间:2010-06-02 09:38:32

标签: linux shell sed

如何删除文件中除最后一行之外的所有单词下面的所有行。假设我有一个包含

的文件
| 02/04/2010 07:24:20 | 20-24 |         26 |       13 |        2.60 | 
| 02/04/2010 07:24:25 | 25-29 |          6 |        3 |        0.60 | 
+---------------------+-------+------------+----------+-------------+

02-04-2010-07:24 --- ER GW 03

+---------------------+-------+------------+----------+-------------+
| date                | sec   | BOTH_MO_MT | MO_or_MT | TPS_PER_SEC |
+---------------------+-------+------------+----------+-------------+
| 02/04/2010 07:00:00 | 00-04 |         28 |       14 |        2.80 | 
| 02/04/2010 07:00:05 | 05-09 |         27 |       14 |        2.70 | 
...
...
...
...
END OF TPS PER 5 REPORT

我需要删除“02-04-2010-07:24 --- ER GW 03”中的所有内容,除了“TOT PER 5 REPORT结束”并保存文件。 这必须为大约700个文件完成。所有文件都是相同的格式,使用datemonthday文件名。

3 个答案:

答案 0 :(得分:1)

sed -ni '/ER GW/ b end; p; d; :end $p; n; b end' $file

$ file应该是文件名。 E.g:

for file in *.txt ; do
    sed -ni '/ER GW/ b end; p; d; :end $p; n; b end' $file
done

答案 1 :(得分:0)

以下awk脚本将执行此操作:

awk '
    /^02-04-2010-07:24 --- ER GW 03$/ {skip=1}
                                      {ln=$0;if (skip!=1){print}}
    END                               {if (skip==1){print $ln}}'

如以下成绩单所示:

$ echo '| 02/04/2010 07:24:20 | 20-24 |         26 |       13 |        2.60 |
| 02/04/2010 07:24:25 | 25-29 |          6 |        3 |        0.60 |
+---------------------+-------+------------+----------+-------------+

02-04-2010-07:24 --- ER GW 03

+---------------------+-------+------------+----------+-------------+
| date                | sec   | BOTH_MO_MT | MO_or_MT | TPS_PER_SEC |
+---------------------+-------+------------+----------+-------------+
| 02/04/2010 07:00:00 | 00-04 |         28 |       14 |        2.80 |
| 02/04/2010 07:00:05 | 05-09 |         27 |       14 |        2.70 |
...
...
...
...
END OF TPS PER 5 REPORT' | awk '
    /^02-04-2010-07:24 --- ER GW 03$/ {skip=1}
    {ln=$0;if (skip!=1){print}}
    END {if (skip==1){print $ln}}'

产生:

| 02/04/2010 07:24:20 | 20-24 |         26 |       13 |        2.60 |
| 02/04/2010 07:24:25 | 25-29 |          6 |        3 |        0.60 |
+---------------------+-------+------------+----------+-------------+

END OF TPS PER 5 REPORT

按要求。

打破它:

  • skip最初为0(false)。
  • 如果您找到想要开始跳过的行,请将skip设置为1(true) - 在必要时更改此模式。
  • 如果skip为false,则输出该行。
  • 无论跳过,都存储最后一行。
  • 最后,跳过是真的,输出最后一行(sjip检查防止双重打印)。

要将其用于多个文件,您只需使用for

即可
for fspec in *.txt ; do
    awk 'blah blah' <${fspec} >${fspec}.new
done

评论中更新所需的命令(搜索"--- ER GW 03")是:

awk '
    /--- ER GW 03/ {skip=1}
                   {ln=$0;if (skip!=1){print}}
    END            {if (skip==1){print $ln}}'

答案 2 :(得分:0)

这可能对您有用:

sed -i '$q;/^02-04-2010-07:24 --- ER GW 03/,$d' *.txt