2016-09-26 17 views
-1

別のawk質問。不要なデータを削除するAwkフラグ

私は私がやりたいものを

43 47 
abc 
efg 
hig 
21 122 
hijk 
lmnop 

39 41 
somemore 
texthere 

は、条件が満たされた場合にのみ、テキストを印刷された数値によって分離された大きなテキストファイルを持っています。

ここに文が満たされた場合、私はすべてのテキストを印刷したいと文がない場合、私は、テキストをスキップしたい運

awk '{a=$1; b=$2; if (a < 43 && a > 37 && b < 52 && b > 41) {f=1} elif (a > 43 && a < 37 && b > 52 && b < 41) {print; f=0} } f' file 

で、私が試したものです満足。上記

から

所望の出力

43 47 
abc 
efg 
hig 


39 41 
somemore 
texthere 
+1

Oneを '<43'、次のテスト'>文のテスト 'if' 43 '。 'a == 43'ならば?正確な一致を確認することは決してありません。 – Barmar

+1

新しいツール/言語を使いたいときは、構文と意味を推測してみてください。試行錯誤のために時間を無駄にしないように、何かを読んでください。この場合、Arnold RobbinsのEffective Awk Programming、第4版を読んでください。また、質問をするときに、あなたが望むことをしないコードを投稿したり、誤ったコードを読んで、あなたが何をしたいかを理解できると期待したりしないでください。あなたは、 '条件が満たされた場合にのみテキストを印刷する'ことを望んでいます - どのような条件ですか?あなたの質問を明確にする[edit]。 –

+2

'a> 43 && a <37'は不可能です。どのようにして数字が43よりも高く、同時に37よりも低くなることがありますか?あなたは '||'を意味していたに違いありません。しかし、たぶんそれは 'elif'ではなく' else'でなければならないかもしれません。 – Barmar

答えて

2
awk ' 
    # on a line with 2 numbers: 
    NF == 2 && $1 ~ /^[0-9]+$/ && $2 ~ /^[0-9]+$/ { 
     # set a flag if the numbers fall in the given ranges 
     f = (37 <= $1 && $1 <= 43 && 41 <= $2 && $2 <= 52) 
    } 
    f 
' file 
1

自己explaniningソリューション:の

awk ' 
    function inrange(x, a, b) { return a <= x && x <= b } 
    /^[0-9]+[\t ]+[0-9]/ { 
     f = inrange($1, 37, 43) && inrange($2, 41, 52) 
    } 
    f 
' 
関連する問題