次のようなデータがあります。
-1033
-
222
100
-30
-
10
私がやりたいのは、「ダッシュのみ」のエントリを除くすべての数字をキャプチャすることです。
以下の私のawkが失敗したのはなぜですか?
awk '$4 != "-" {print $4}'
あなたの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は、そのための優れたツールです。
データ ファイルが実際には複数列であり、値が列 4 にあると仮定すると、次のように動作します。
awk '$4 != "-" {print $4} {}'
「-」以外の場所にのみ値を出力します。デフォルトのアクションは印刷であるため、バージョンはおそらく関係なく(または2回)値を印刷します。を追加する{}と、デフォルトのアクションが「何もしない」になります。
データが実際に示されているとおりである場合 (1 列のみ)、使用する$1必要があります。.$4$0$0"-1033 ""- "
しかし、それが単一の列である場合、私は awk をまったく使用せず、次のようにします。
grep -v '^-$'
grep -v '^ *- *$'
2 つ目は、文字の両側にスペースを入れることができます"-"。
なぜあなたはチェックしています$4か?$1または$0litbが言ったようにチェックする必要があるようです。
しかし、awk は、この作業には重量級のツールです。試す
grep -v '^-$'
ダッシュまたはダッシュのみを含む行を削除するには
grep -v '^ *- *$'
ダッシュと場合によってはスペース文字のみを含む行を削除するには。