2

Linuxには、いくつかの反復を実行するときに座標のリストをわずかに変更するプログラムがあります。grep -cを使用して反復回数をカウントでき、そのプログラム出力からラベルと座標の最後のセットを取得したいと思います。

私のソースファイルは次のようになります。

text
total number of objects with coordinates = n
text
begin coordinates
label1 x1 y1 z1
label2 x2 y2 z2
...
labeln xn yn zn
end coordinates
text
text
begin coordinates
label1 a1 b1 c1
label2 a2 b2 c2
...
labeln an bn cn
end coordinates
text
text

この場合、ラベルのセットをa、b、c座標とともに、次のようなテキストファイルにダンプします。

label1 a1 b1 c1
label2 a2 b2 c2
...
labeln an bn cn

私の好みは、これを行うためにgrepやawkのようなものを使用することですが、これを実装するのに十分な知識がありません。

編集:ラベルが一定でも一意でもないため、label2がlabel5またはlabelnと等しくなる可能性があることを忘れました。

4

3 に答える 3

1

必要になりawkます。

パターン範囲の最後の出現を取得するには:

awk '/label1/ { r="" } /label1/,/labeln/ { r = ( r ? r RS : "") $0 } END { print r }' file

パターン範囲のn番目のオカレンスを取得するには:

awk -v n=2 '/label1/ { f++; r="" } f { r = (r ? r ORS : "") $0 } /labeln/ && f==n { print r; f=0 }' file

これにより、2番目のオカレンス(n=2)が検出されます。これを簡単に変更して、目的のオカレンスを見つけることができます。


編集:

パターン範囲の最後の出現を取得するには:

awk '/begin/ { f=1; r=""; next } f && !/end/ { r = (r ? r ORS : "") $0 } /end/ { f=0 } END { print r }' file

パターン範囲のn番目のオカレンスを取得するには:

awk -v n=2 '/begin/ { f++; r=""; next } f && !/end/ { r = (r ? r ORS : "") $0 } /end/ && f==n { print r; r="" }' file

これにより、2番目のオカレンス(n=2)が検出されます。これを簡単に変更して、目的のオカレンスを見つけることができます。HTH。

于 2013-01-25T18:47:55.680 に答える
1

「ファイルの最後のものを取得する」と表示されたら、次のように思います。tacファイルを下から上に印刷します。

tac file | awk '
    /^begin coordinates/ {exit} 
    p {print} 
    /^end coordinates/ {p=1}
' | tac
于 2013-01-25T19:32:25.593 に答える
1

が表示されたらbegin coordinates、新しいテキストブロックの保存を開始します。が表示されたら保存を停止しますend coordinates。ファイルの最後に、保存したテキストの最後のブロックを印刷します。

#!/usr/bin/env awk -f

/^begin coordinates/ { text = ""; save = 1 }
save { text = text $0 "\n" }
/^end coordinates/ { save = 0 }
END { print text }

text = text $0 "\n"は変数text$0を連結していることに注意してください\n。ホワイトスペースはawkの連結演算子です。

于 2013-01-25T19:35:34.123 に答える