9

awk を使用して、読み取る値を「null」に割り当てるにはどうすればよいでしょうか。

これには設定されたキャラクターがあると確信していますが、それを見つけることができません。

例えば、

次のような awk の文字列があります。

awk '
$3==24{print "stuff"}
$3==23{print "stuff"}
'

$3 = blank {print "stuff"} の場合、同じ形式を使用して空白の列を考慮する方法を知る必要があります。

ありがとう!

4

2 に答える 2

11

これをやってみてください:

awk '
    $3==24{print "stuff"}
    $3==23{print "stuff"}
    !$3{print "null"}
' file.txt

$3ゼロ ( falsefor ) の場合に処理する必要がある場合は、次のことawkを試してください。

!$3 && $3 != 0{print "null"}
于 2013-03-27T17:40:02.787 に答える
8

デフォルトの awk 処理では、「空白」の列はありません。

フィールドは空白、つまり 1つ以上の空白文字 (基本的にはタブとスペース) で区切られます。したがって、次の入力が与えられます。

this that the_other
foo       bar

最初の行$1の 、$2、および$3this、それぞれ 、 that、およびthe_otherですが、2 番目の行のbar$2です。最初のフィールドと 2 番目のフィールドの間に空白がいくつあってもかまいません。

別のフィールド セパレータを指定すると、空のフィールドを持つことができます。

$ ( echo 'this:that:the_other' ; echo 'foo::bar' ) | awk -F: '{print $3}'
the_other
bar

または、スクリプト自体でフィールド セパレータを設定する場合は、次のようにします。

$ ( echo 'this:that:the_other' ; echo 'foo::bar' ) | \
    awk 'BEGIN { FS = ":" } {print $3}'
the_other
bar

ただし、フィールド セパレータとして正規表現を使用できます。

$ ( echo 'this that the_other' ; echo 'foo  bar' ) | \
  awk 'BEGIN { FS = "[ ]" } {print $3}'
the_other
bar

(一部の非常に古い Awk 実装では、ここでの正規表現がサポートされていない場合があります。)

正規表現"[ ]"は、スペース文字と同じ特別な扱いを受けません。

GNU Awk マニュアルへの参照:

デフォルトのフィールド分割:

通常、フィールドは単一のスペースではなく、一連の空白文字 (スペース、TAB、および改行) で区切られます。連続する 2 つのスペースは、空のフィールドを区切りません。フィールド セパレータのデフォルト値は、FS1 つのスペースを含む文字列" "です。awk がこの値を通常の方法で解釈した場合、各スペース文字はフィールドを分離するため、2 つのスペースが連続すると、それらの間に空のフィールドが作成されます。これが起こらない理由は、 の値としての 1 つのスペースがFS特殊なケースであるためです。これは、フィールドを区切るデフォルトの方法を指定するために使用されます。

FSが などの他の 1 文字の場合","、その文字が出現するたびに 2 つのフィールドが区切られます。2 回連続して出現すると、空のフィールドが区切られます。文字が行頭または行末にある場合、それも空のフィールドを区切ります。スペース文字は、これらの規則に従わない唯一の単一文字です。

正規表現を使用してフィールドを区切る.

ただし、これには注意してください。別のセパレータを使用するようにファイルを変更する必要があるか、解析がフィールド間の空白の数に敏感になります ( foo bar(空白が 1 つ) と (空白が 2 つ) は区別されますfoo bar)。

アプリケーションによっては、awk で認識されるフィールドではなく、列番号で行を解析することを検討する場合があります。

于 2013-03-27T17:45:06.447 に答える