次のようなデータがあります。
-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
または$0
litbが言ったようにチェックする必要があるようです。
しかし、awk は、この作業には重量級のツールです。試す
grep -v '^-$'
ダッシュまたはダッシュのみを含む行を削除するには
grep -v '^ *- *$'
ダッシュと場合によってはスペース文字のみを含む行を削除するには。