入力ファイルの一部を抽出するawkスクリプト

入力ファイルの一部を抽出するawkスクリプト

awk「start」の入力ファイルを検索し、「next」を含む行を見つけて、次の行を表示するスクリプトを作成するにはどうすればよいですか?このような:

    [user]$ cat test.txt
    start
    next
    This line should print
    Ignore this


    [user]$ display.awk test.txt
    This line should print

    [user]$ cat test1.txt
    Ignore this
    next
    Ignore this
    start
    Ignore this
    next
    This line should print
    Ignore this
    next
    Too late so ignore this too
    start
    Ignore this too

    [user]$ display.awk test1.txt
    This line should print

答え1

これは文章です:

awk 'BEGIN {start="no"; nextline="no"}; nextline=="yes" {print; exit}; (start=="yes" && /^next$/) {nextline="yes"}; /^start$/ {start="yes"}' test.txt 

スタンドアロンスクリプトで:

#!/bin/awk -f

BEGIN {start="no"; nextline="no"}
nextline=="yes" {print; exit}
(start=="yes" && /^next$/) {nextline="yes"}
/^start$/ {start="yes"}

説明する

最初のポイントを最初に読んだ後、残りのポイントを逆に読み取る方が合理的です。

  • BEGIN {start="no"; nextline="no"}:まず、2つの変数を次に設定します"no"(つまり、まだ見つかりませんでした)。 NBはnext予約語なので使用しましたnextline
  • nextline=="yes" {print; exit}next:前の行で見つかった場合は、その行を印刷して終了します。
  • (start=="yes" && /^next$/) {nextline="yes"}:発見後の行でも検索すると次に設定さstartれます。nextnextline"yes"
  • /^start$/ {start="yes"}:開始が見つかったらstartに設定します"yes"

答え2

代替ソリューションsed:

sed -n '/start/,${        # in this range
$!{                       # if not the last line                         
/next/{                   # and if line matches "next"
n                         # read in the next line
p                         # print pattern space
q                         # quit
}
}
}' infile

そしてgnu sed

sed -n '/start/,${$!{/next/{n;p;q}}}' infile

答え3

これも動作するはずです

awk 'BEGIN {l1=0} /^start$/{l1=1} /^next$/ && l1==1 {l2=NR+1} NR==l2 {print;l1=0}' test.txt

これは、レコード番号NRを使用して、出発線以降に最初に会ったレコード以降のレコードを印刷する。

関連情報