0

次のようなデータがあります。

-1033  
-  
222
100
-30
-
10

私がやりたいのは、「ダッシュのみ」のエントリを除くすべての数字をキャプチャすることです。

以下の私のawkが失敗したのはなぜですか?

 awk '$4 != "-" {print $4}'
4

3 に答える 3

1

あなたのawkスクリプトは言う

4番目のフィールドがダッシュでない場合は、印刷します

ただし、線がダッシュでない場合は印刷する必要があります

awk '$0 != "-"'

デフォルトのアクションは印刷することなので、本文は必要ありません。

数値のグループを出力する場合、gawkを使用する場合はGNUawk拡張機能を使用できます。正規表現を使用してレコードを分割できます。

gawk 'BEGIN { RS="(^|\n)-($|\n)" } { print "Numbers:\n" $0 }'

現在、行の代わりに、。のみを含む行で区切られた数値のグループを取ります-。フィールド区切り文字(FS)を改行に設定すると、そのようなグループ内の数値を繰り返すことができます。

gawk 'BEGIN { FS="\n"; RS="(^|\n)-($|\n)" } 
      { print "Numbers:"; for(i=1;i<=NF;i++) print " *: " $i }'

しかし、私は他の答えに同意します。一部のテキストに一致する行を除外したいだけの場合grepは、そのための優れたツールです。

于 2009-03-23T02:16:18.020 に答える
1

データ ファイルが実際には複数列であり、値が列 4 にあると仮定すると、次のように動作します。

awk '$4 != "-" {print $4} {}'

「-」以外の場所にのみ値を出力します。デフォルトのアクションは印刷であるため、バージョンはおそらく関係なく(または2回)値を印刷します。を追加する{}と、デフォルトのアクションが「何もしない」になります。

データが実際に示されているとおりである場合 (1 列のみ)、使用する$1必要があります。.$4$0$0"-1033 ""- "

しかし、それが単一の列である場合、私は awk をまったく使用せず、次のようにします。

grep -v '^-$'
grep -v '^ *- *$'

2 つ目は、文字の両側にスペースを入れることができます"-"

于 2009-03-23T02:48:57.287 に答える
1

なぜあなたはチェックしています$4か?$1または$0litbが言ったようにチェックする必要があるようです。

しかし、awk は、この作業には重量級のツールです。試す

grep -v '^-$'

ダッシュまたはダッシュのみを含む行を削除するには

grep -v '^ *- *$'

ダッシュと場合によってはスペース文字のみを含む行を削除するには。

于 2009-03-23T02:52:30.227 に答える