OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

ある単語を含む行と、1つ前の行とを削除するシェル

  • 暇なときにでも
  • 質問No.221826
  • 閲覧数1261
  • ありがとう数1
  • 気になる数0
  • 回答数1
  • コメント数0

お礼率 68% (20/29)

UNIX初心者です。
シェル(Korn)で、あるファイル中に、単語 "iwa"を含んだら、その行と、1つ前の行とを削除したいシェルを作りたいのです。 
つまり、grep, sed, awk などで、"iwa"を含む行がみつかったら、その行(iwaを含む行)と、なおかつ、1行前の合わせて、2行を削除するシェルを作りたいのですが、行番号(NR?)などを使うのでしょうか?

よろしく、お願いします。
通報する
  • 回答数1
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.1
レベル9

ベストアンサー率 43% (27/62)

sedはよくわからないのでawkで説明させていただきます。
(恐らくawkでしか実現できないでしょう)
awkでもCでも「行を削除」したいと思いがちですが、削除という命令はありません。
一行前の行を変数に保存しておき、今の行を判定して「表示」するかしないかを決定します。
言葉で説明するのは難しいので答えをあげてしまいます。

BEGIN {
old = "";
}

{
/* 今の行がiwaを含んでいなければ前の行を表示 */
if( $0 !~ "iwa" )
{
/* さらに前の行もiwaを含んでいなければ表示 */
if( old !~ "iwa" )
printf( "%s\n", old );
}
old = $0;
}

END {
/* 最後の一行にiwaが含まれていなければ表示 */
if( old !~ "iwa" )
printf( "%s\n", old );
}

このスクリプトではチルダ(~)を使用してますので、awkではなく、nawkを使う必要があります。
チルダは、左の文字列変数が右の文字列を含んでいるという意味になり、
エクスクラメーション(!)は否定ですので、
old !~ "iwa" は、oldに"iwa"が含まれていないという意味になります。
NRはawkの性質上、今読み込んだ行がテキストの何行目になるかという
情報ですので今回の用途では使用できません。

awkの使い方がわからないといけないのでついでに説明しておきます。
上のスクリプトをaaa.awkというファイルに格納し、「あるファイル」がbbb.txtだった場合、
nawk -f aaa.awk bbb.txt >ccc.txt
と打ち込むとccc.txtにその結果が格納されます。

お分かりいただけたでしょうか?
お礼コメント
iwasa

お礼率 68% (20/29)

ありがとうございました。

さっそく、awkでやってみます。

ありがとうございました。

20点ポイントでは、足りない?でしょうか?(笑)

awk スクリプトが書いてなければ、10ポイント?
かな?と勝手ながら、判断しました。

回答を締め切らせていただきました。
投稿日時 - 2002-02-21 10:07:01
-PR-
-PR-
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ