awkを作成して列を取得します。

awkを作成して列を取得します。

次の質問があります。

構造情報を見る:

0   PATRAC_1  False   Normal    Normal  3     Not configure

7つの列と7つの値があるため、awkを使用して値を取得する必要があります。最初はスペースなどの区切り文字を使用するため、 を入力するとprint $1「0」が表示され、 を入力するとprint $2「が表示されます。 PATRAC_1」など

ただし、列7を取得しようとすると、「not」と「configure」の間にスペースがあるため、「Not」のみが表示されます。

それでは、問題を解決するにはどうすればよいですか?

答え1

データが固定列にある場合は、その列を分割するようにawkに要求できます。列幅設定を介してFIELDWIDTHS。たとえば、

awk '
 BEGIN{ FIELDWIDTHS="4 10 8 10 8 6 99" }
 { printf "1=%s 2=%s 7=%s\n", $1, $2, $7 }
'

与えられた

1=0    2=PATRAC_1   7=Not configure     

答え2

デフォルトでは、awk は一連のスペースを列区切り文字として扱います。 7番目の列が行の終わりまで(埋め込まれたスペースを含む)まで拡張されることを望んでいるとは思えないので、これを教えてください。

スペースの量は列ごとに異なるため、スペースに基づいて列定義を維持します。ただし、最後の列を使用する代わりに、その行の$7テキストから最初の6つの列を引いたものを使用してください。

awk '{
    last_column = $0;
    sub(/^[[:blank:]]*([^[:blank:]]+[[:blank:]]+){6}/, "", last_column);
    print last_column;
}'

文字クラスをサポートしていない古いバージョンのawkがある場合は[ \t]代わりに[[:blank:]]。以前のバージョンのawkが正規表現で中括弧をサポートしていない場合は、正規表現の6つのコピーを作成します。

関連情報