awkを使用すると発生する問題

awkを使用すると発生する問題

awkや他の方法を使用するのに役立ちますか?

入力ファイルには次の内容が含まれています。

PROD   192.168.100.25   Unix                       Active
PROD   192.168.100.26   Unix - Server              Active
DEV    192.168.100.27   windows Gateway            Active
TEST   192.168.100.28   Unix Test Server           Not Active
PROD   192.168.100.29   windows mail gateway       Active down 
PROD   192.168.100.30   Unix                       Active down

今awkを使用して列2と4を取得します。以下を参照してください。

awk '{print $2  $4}' Inputfile

結果 -

192.168.100.25   Active                       
192.168.100.26   -               
192.168.100.27   Gateway             
192.168.100.28   Test           
192.168.100.29   mail        
192.168.100.30   Active

予想される結果 -

192.168.100.25   Active                       
192.168.100.26   Active               
192.168.100.27   Active             
192.168.100.28   Not Active           
192.168.100.29   Active down        
192.168.100.30   Active down  

答え1

デフォルトでは、AWK のフィールドはスペースで区切られます。空白がどれだけ多いかは関係ありませんので、次のファイルは同じ結果を提供します。

PROD   192.168.100.25   Unix   Active
PROD   192.168.100.26   Unix   -        Server   Active

この2行の4番目のフィールドは明らかにActivesumです-


これで、ファイル形式は実際には次のようになります。フィールドはタブで区切られ、その間にはスペースのみが含まれます。 SEに公開した後、タブは保持されないと思われます。

そうすれば、線はより似ているように見えます。

PROD<tab>192.168.100.26<tab>Unix - Server<tab><tab>Active

次のようにタブを区切り文字として使用するようにAWKに指示できます。

$ awk -F '\t+' '{print $2, $4}' file.txt
192.168.100.25 Active
192.168.100.26 Active

しかし、各フィールドの間にタブを置く方が一般的です。つまり、可変長データとうまく合わない。それからawk -F '\t'


列が実際に固定幅の場合は、次を使用してcut必要な部分を選択できます。ただし、この場合は文字を手動で計算する必要があります。

         1         2         3         4         5         6         7
1234567890123456789012345678901234567890123456789012345678901234567890
PROD   192.168.100.29   windows mail gateway       Active down 

上記の数で判断すると、次のように動作できます。

$ cut -c8-23,52-70 file-fixed.txt
192.168.100.25  Active
192.168.100.26  Active
192.168.100.27  Active
192.168.100.28  Not Active
192.168.100.29  Active down 
192.168.100.30  Active down

少なくとも、GNU AWKは固定幅フィールドもサポートしていますが、これについては深く調査していません。バラよりhttps://www.gnu.org/software/gawk/manual/html_node/Fixed-width-data.html

答え2

まず、awkは、ユーザーが要求した操作を実行していることを明確にします。デフォルトではフィールドを区切ります。スペース、関心のある列にはスペース文字を含めることができるため、各スペースはawkの新しいフィールドを表します。

2つのランダムな文字列入力がある場合は、Linuxコマンドを使用してフィールドを解析してから分離するのは困難ですcolumn。私の経験では、Pythonなどのより強力なプログラミング言語を呼び出す方が良いです。私はPython CSVライブラリに固定幅フィールドの形式を推論するツールがあると思います。

「アクティブ」「非アクティブ」「下」オプションのみを使用するように最後のフィールドを変更できる場合は、以下を使用できます。

awk '{ print $2 $NF }' Inputfile

$NFこれは「フィールド数」を意味し、最後のフィールドを選択するのと同じです。

ただし、データの最後の列にはスペースが含まれる場合と含まれない場合があり、この構文が壊れます。

または、他の人が指摘したように、フィールドがタブで区切られている場合は、次のものを使用できます。

awk -F $'\t' '{ print $2 $4 }' Inputfile

フラグは、タブ文字であるフィールド区切り-F文字を指定します。$'\t'

ただし、項目が次のような場合いいえタブで区切られているため、このデータ型に関連する操作を実行する必要があるかもしれません。異なる形式の入力ファイルがある場合は、エラーが表示されることがあります。

以下は、すべてのインスタンスを使用する例です。複数フィールド区切り文字として使用される空白文字:

awk -F ' {2,}' '{ print $2 $NF }' Inputfile

この場合、フィールド区切り文字は正規表現です。これは、「複数の空白文字で構成されるインスタンス」と同じです。

これは、提供された例では機能しますが、最初または最後のフィールド以外のフィールドが必要な場合は、列3に複数のスペースが含まれている場合でも問題が発生する可能性があります。

答え3

この場合、awkを使用するには、まず「Not Active」と「Active down」のスペースを別の文字に置き換えます。

sed 's/Not Active/Not_Active/g ; s/Active down/Active_down/g' inputfile

次に、awkを使用して2番目と最後のフィールドを抽出します。

awk '{print $2,$NF}'

最後に、次のスペースを復元します。

sed 's/_//g'

これらすべてをまとめると、最終的なコマンドは次のようになります。

sed 's/Not Active/Not_Active/g ; s/inputfile down/Active_down/g' active | awk '{print $2,$NF}' | sed 's/_/ /g'

関連情報