2つ以上の連続する行に特定のパターンが含まれている場合は、一致するすべての行を削除し、最初の行だけを残します。
以下の例では、2つ以上の連続する行に「論理IO」が含まれている場合、一致するすべての行を削除する必要がありますが、最初の行は保持します。
入力ファイル:
select * from test1 where 1=1
testing logical IO 24
select * from test2 where condition=4
parsing logical IO 45
testing logical IO 500
handling logical IO 49
select * from test5 where 1=1
testing logical IO 24
select * from test5 where condition=78
parsing logical IO 346
testing logical IO 12
出力ファイル:
select * from test1 where 1=1
testing logical IO 24
select * from test2 where condition=4
parsing logical IO 45
select * from test5 where 1=1
testing logical IO 24
select * from test5 where condition=78
parsing logical IO 346
承認された回答:
awk
を使用する :
awk '/logical IO/ {if (!seen) {print; seen=1}; next}; {print; seen=0}' file.txt
-
/logical IO/ {if (!seen) {print; seen=1}; next}
行にlogical IO
が含まれているかどうかを確認します 、見つかった場合、変数seen
falseです。つまり、前の行にlogical IO
が含まれていません 、次に行を印刷し、seen=1
を設定します 次の行に移動します。それ以外の場合は、前の行にlogical IO
があるため、次の行に移動します。 -
その他の行については、
{print; seen=0}
、行とセットseen=0
を出力します
例:
$ cat file.txt
select * from test1 where 1=1
testing logical IO 24
select * from test2 where condition=4
parsing logical IO 45
testing logical IO 500
select * from test5 where 1=1
testing logical IO 24
select * from test5 where condition=78
parsing logical IO 346
parsing logical IO 346
testing logical IO 12
$ awk '/logical IO/ {if (!seen) {print; seen=1}; next}; {print; seen=0}' file.txt
select * from test1 where 1=1
testing logical IO 24
select * from test2 where condition=4
parsing logical IO 45
select * from test5 where 1=1
testing logical IO 24
select * from test5 where condition=78
parsing logical IO 346