次の質問があります。
構造情報を見る:
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つのコピーを作成します。