簡體   English   中英

腳本刪除一個單詞以外的所有/ n行數(最后一行除外)

[英]Script to delete all /n number of lines starting from a word except last line

如何刪除單詞下除文件中最后一行以外的所有行。 假設我有一個包含

| 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”中刪除所有內容,除了“每5份報告的TPS結束時間”,然后保存文件。 這大約需要處理700個文件。 所有文件的格式相同,帶有datemonthday文件名。

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

$ file應該是文件名。 例如:

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

以下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(假)。
  • 如果找到要從其開始跳過的行,請將skip設置為1(true)-必要時更改此模式。
  • 如果skip為false,則輸出該行。
  • 無論跳過,存儲最后一行。
  • 最后,is skip為true,輸出最后一行(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}}'

這可能對您有用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM