AWKを使用して***で区切られた段落を抽出します。

AWKを使用して***で区切られた段落を抽出します。

次のファイルがあります。

blablabla
blablabla
***
thingsIwantToRead1
thingsIwantToRead2
thingsIwantToRead3

blablabla
blablabla

で段落を抽出したいと思いますthingsIwantToRead。このような問題に対処する必要があるとき、私は次のものを使用しました。AWKこのように:

awk 'BEGIN{ FS="Separator above the paragraph"; RS="" } {print $2}' $file.txt | awk 'BEGIN{ FS="separator below the paragraph"; RS="" } {print $1}'

効果がありました。

この場合にはFS="***"、、 (AWKが一般アスタリスクで処理するため動作しません)または私が考えられる正規表現を入力してみましたが動作しません(何も印刷しません)"\*{3}""\*\*""\\*\\*"

理由をご存知ですか?

そうでなければ、私の問題を解決する他の方法を知っていますか?

以下は、解析したいファイルから抜粋したものです。

13.2000000000     , 3*0.00000000000       ,  11.6500000000     , 3*0.00000000000       ,  17.8800000000

Blablabla

  SATELLITE EPHEMERIS
     ===================
Output frame: Mean of J2000

       Epoch                  A            E            I           RA           AofP          TA      Flight Ang
*****************************************************************************************************************
2012/10/01 00:00:00.000     6998.239     0.001233     97.95558     77.41733     89.98551    290.75808    359.93398
2012/10/01 00:05:00.000     6993.163     0.001168     97.95869     77.41920    124.72698    274.57362    359.93327
2012/10/01 00:10:00.000     6987.347     0.001004     97.96219     77.42327    170.94020    246.92395    359.94706
2012/10/01 00:15:00.000     6983.173     0.000893     97.96468     77.42930    224.76158    211.67042    359.97311
 <np>
 ----------------
 Predicted Orbit:
 ----------------

 Blablabla

私は以下を抽出したい:

2012/10/01 00:00:00.000     6998.239     0.001233     97.95558     77.41733     89.98551    290.75808    359.93398
2012/10/01 00:05:00.000     6993.163     0.001168     97.95869     77.41920    124.72698    274.57362    359.93327
2012/10/01 00:10:00.000     6987.347     0.001004     97.96219     77.42327    170.94020    246.92395    359.94706
2012/10/01 00:15:00.000     6983.173     0.000893     97.96468     77.42930    224.76158    211.67042    359.97311

* 行の後の数字を取得しようとしたコマンドは次のとおりです。

`awk 'BEGIN{ FS="\\*{2,}"; RS="" } {print $2}' file | awk 'BEGIN{ FS="<np>"; RS="" } {print $1}'`

ベストアンサー1

2つの区切り文字の間を印刷するようにawkに指示します。具体的には:

awk '/\*{4,}/,/<np>/' file

区切り文字を含む行も印刷されるため、次のように区切り文字を削除できます。

awk '/\*{4,}/,/<np>/' file | tail -n +2 | head -n -1

または、行が最初の区切り文字と一致する場合は変数をtrueに設定し、2番目の区切り文字と一致する場合はfalseに設定し、trueの場合にのみ印刷できます。

awk '/\*{4,}/{a=1; next}/<np>/{a=0}(a==1){print}' file

a現在の行が4つ以上に一致する場合、上記のコマンドはこれを1に設定し、その行に*ジャンプnextします。これは、対応する***行が印刷されないことを意味します。


これは質問の元の誤解されたバージョンへの答えです。少し違う状況で役に立つかもしれませんので、ここに残しておきます。

FSまず、(フィールド区切り記号)を必要とせずRS(レコード区切り記号)が必要です。その後、リテラルを渡すには*2回エスケープする必要があります。一度はバックスラッシュをエスケープし*、一度はバックスラッシュをエスケープします(そうでなければ、awkは\rorと同じ方法で一致しようとします\t)。次に、2番目の「行」を印刷します。

$ awk -vRS='\\*\\*\\*' 'NR==2' file

thingsIwantToRead1   
thingsIwantToRead2   
thingsIwantToRead3  

出力の周りに空白行を避けるには、次のようにします。

$ awk -vRS='\n\\*\\*\\*\n' 'NR==2' file
thingsIwantToRead1   
thingsIwantToRead2   
thingsIwantToRead3  

これは***後で想定されます。提示する最初の段落の直後ではなく、段落。

おすすめ記事