次のファイルがあります。
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は\r
orと同じ方法で一致しようとします\t
)。次に、2番目の「行」を印刷します。
$ awk -vRS='\\*\\*\\*' 'NR==2' file
thingsIwantToRead1
thingsIwantToRead2
thingsIwantToRead3
出力の周りに空白行を避けるには、次のようにします。
$ awk -vRS='\n\\*\\*\\*\n' 'NR==2' file
thingsIwantToRead1
thingsIwantToRead2
thingsIwantToRead3
これは***
後で想定されます。各提示する最初の段落の直後ではなく、段落。