2017-09-14 4 views
-1

誰かがこのタスクを実行する方法を教えてくれることを願っています。2つの基準を使って行を抽出する

私はawkがこれを行うには良いかもしれないと思っていますが、私は本当に初心者です。

私は以下のようなファイルを持っています(タブが区切られ、実際のファイルははるかに大きくなります)。 重要な列は2番目と9番目です(ファイルの1行目の235と15)。

S 235 1365 * 0 * * * 15 1 c81 592 
H 235 296 99.7 + 0 0 3I296M1066I 14 1 s15018 1 
H 235 719 95.4 + 0 0 174D545M820I 15 1 c2664 10 
H 235 764 99.1 + 0 0 55I764M546I 15 1 c6519 4 
H 235 792 100 + 0 0 180I792M393I 14 1 c407 107 
S 236 1365 * 0 * * * 15 1 c474 152 
H 236 279 95 + 0 0 765I279M321I 10-1 1 s7689 1 
H 236 301 99.7 - 0 0 908I301M156I 15 1 s8443 1 
H 236 563 95.2 - 0 0 728I563M74I 17 1 c1725 12 
H 236 97 97.9 - 0 0 732I97M536I 17 1 s11472 1 

第9列の値を指定して行を抽出したいと思います。このとき、2番目の列はピボット列のようになります。私がピボットカラムを意味するのは、2番目のカラムが同じ値を持つ場合、1組のデータとして考えることです。行セット内では、すべての行が第9列に特定の値を持つ必要があります。

したがって、たとえば9番目の列「14」と「15」を指定するとします。それから出てくるだろう。

S 235 1365 * 0 * * * 15 1 c81 592 
H 235 296 99.7 + 0 0 3I296M1066I 14 1 s15018 1 
H 235 719 95.4 + 0 0 174D545M820I 15 1 c2664 10 
H 235 764 99.1 + 0 0 55I764M546I 15 1 c6519 4 
H 235 792 100 + 0 0 180I792M393I 14 1 c407 107 

第6及び第8行は、それらの9列目の「15」を有するが、「セット」内の他の行は(第2列で指定された:236)、「14」または「15」以外の値を持っているので、私行を抽出したくない。

答えて

2
$ cat tst.awk 
$2 != prevPivot { prtCurrSet() } 
$9 !~ /^1[45]$/ { isBadSet=1 } 
{ currSet = currSet $0 ORS; prevPivot = $2 } 
END { prtCurrSet() } 
function prtCurrSet() { 
    if (!isBadSet) { 
     printf "%s", currSet 
    } 
    currSet = "" 
    isBadSet = 0 
} 

$ awk -f tst.awk file 
S 235 1365 * 0 * * * 15 1 c81 592 
H 235 296 99.7 + 0 0 3I296M1066I 14 1 s15018 1 
H 235 719 95.4 + 0 0 174D545M820I 15 1 c2664 10 
H 235 764 99.1 + 0 0 55I764M546I 15 1 c6519 4 
H 235 792 100 + 0 0 180I792M393I 14 1 c407 107 
+0

こんにちはエド、私はもう1つの条件をお聞きしたいと思います。私は9列目で指定したすべての値を含むピボットラインセットを抽出したいと思います。私は上記の例では表示しませんでしたが、現行のスクリプトを使用すると、ピボットラインセットにはわずか14または15しかありません。 – user2182606

+0

確かに、それ自身のサンプル入力/出力/要件で新しい質問を投稿してください。 –

+0

新しい質問を数分で準備します。 – user2182606

1

期待される出力を見ても、完全に要件が不明な場合は、次のようにお試しください。

awk '$2 == 235 && ($9 == 14 || $9 == 15)' Input_file 

出力は以下のようになります。

S 235 1365 * 0 * * * 15 1 c81 592 
H 235 296 99.7 + 0 0 3I296M1066I 14 1 s15018 1 
H 235 719 95.4 + 0 0 174D545M820I 15 1 c2664 10 
H 235 764 99.1 + 0 0 55I764M546I 15 1 c6519 4 
H 235 792 100 + 0 0 180I792M393I 14 1 c407 107 
1

ショートawkのの式:

awk '$2==235 && $9~/^1[45]$/' file 

  • $9~/^1[45]$/ - 9番目のフィールドが一致していることを保証いずれか14または15
関連する問題