2012-03-17 15 views
1

awkを使用して書式設定されたファイルを読み込もうとしています。コンテンツは次のようになります。awkを使用した書式設定の読み込み

1PS1  A1 1 11.197 5.497 7.783 
    1PS1  A1 1 11.189 5.846 7.700 
    . 
    . 
    . 

Cフォーマットに続いて、これらの線は、次の形式 "%5dの%5S%5S%5D%8.3f%.3f%8.3f" 、第5の位置にあります次の5つの位置は文字(A1)、次に5つの位置は整数(1)、次の24の位置は3つの小数点浮動小数点数の8つの位置に分割されます。

私が使っているのは、これらの行を "$ 1、$ 2、$ 3"を使って列で区切って呼び出すことです。たとえば、

cat test.gro | awk 'BEGIN{i=0} {MolID[i]=$1; id[i]=$2; num[i]=$3; x[i]=$4; 
y[i]=$5; z[i]=$6; i++} END { ...} >test1.gro 

しかし、これでいくつかの問題が発生しましたが、今ではこれらのファイルを上記のように書式で読み込もうとしています。

どうすればいいですか?

答えて

2

サンプル入力を見ると、フォーマット文字列は実際には"%5d%-5s%5s%5d%8.3f%.3f%8.3f"で、最初の文字列フィールドは左寄せになっているようです。それはあまりにも悪いawkがscanf()機能を持っていないのですが、あなたは、あなたがGNU AWKを持っている場合は、あなたがFIELDWIDTHS変数を使用することができ、いくつかのsubstr()通話

awk -v OFS=: ' 
    { 
    a=substr($0,1,5) 
    b=substr($0,6,5) 
    c=substr($0,11,5) 
    d=substr($0,16,5) 
    e=substr($0,21,8) 
    f=substr($0,29,8) 
    g=substr($0,37,8) 
    print a,b,c,d,e,f,g 
    } 
' 

出力

1:PS1 : A1: 1: 11.197: 5.497: 7.783 
    1:PS1 : A1: 1: 11.189: 5.846: 7.700 

を使用してデータを取得することができます

gawk -v FIELDWIDTHS="5 5 5 5 8 8 8" -v OFS=: '{print $1, $2, $3, $4, $5, $6, $7}' 

012を出力します。このような
1

あなたは、私がawkの作品は(あなたの選択はあなたの出力フォーマット文字列フィールドに空白を呼び出すことについて、明示的であることを私は心配になりと思う方法については明確にしたいのですが何番目なので、持ってすべきだと思うフィールドを正確に言ったことはありませんこれについては、awkとは違う考えがあります)。

manページから:

入力行は通常、空白、 によって、または正規表現FSで区切られたフィールドで構成されています。フィールドは$ 1、$ 2、...と表示され、 $ 0は行全体を表します。 FSがヌルの場合、入力行は1文字につき1つのフィールドに分割されます( )。

は、入力行の空白はフィールド番号を割り当てられませんし、そのシーケンシャル空白は単一のフィールドセパレータとして扱われることに注意してください。コマンドラインで

echo "1 2 3 4" | awk '{print "1:" $1 "\t2:" $2 "\t3:" $3 "\t4:" $4}' 

次のようなものでこれをテストすることができます。


このすべては、あなたが、もちろん、FS変数をdiddlesていないことを前提としています。

+0

ありがとうございました。実際には、私はgawkでFIELDWIDTHSオプションを使用できることを忘れていました。 – Greg

+0

@Greg:問題を解決した 'FIELDWIDTHS'だったら、グレンの答えを受け入れるべきではありませんか? – dmckee

+0

訂正のためにdmckeeに感謝します。 – Greg

関連する問題