2016-02-24 31 views
-1

我有這個巨大的表〜200K行和列(選項卡分隔)。我想根據這個特定列的值$ 4來選擇它們,因此它們的值間隔至少爲100,但也要考慮列3的值。即打印根據價值距離,但考慮另一列

id  tag  xxx position score 
id_1 aaaaaaa bbbbb 3190 1 
id_2 aaaaaaa bbbbb 3199 1 
id_3 aaaaaaa bbbbb 3300 1 
id_4 aaaaaaa bbbbb 3350 1 
id_5 aaaaaaa ccccc 100 1 
id_6 aaaaaaa ccccc 500 1 
id_7 aaaaaaa ccccc 550 1 
id_8 aaaaaaa ccccc 599 1 

爲了得到這樣的:

id  tag  block position score 
    id_1 aaaaaaa bbbbb 3190 1 
    id_3 aaaaaaa bbbbb 3300 1 
    id_5 aaaaaaa ccccc 100  1 
    id_6 aaaaaaa ccccc 500  1 

前段時間@ hek2mgl helpedme根據距離來過濾使用此代碼

awk 'NR<3; NR==2{pv=$4} NR>2 && ($4-pv>=100){print;pv=$4}' file 

但是值之間存在巨大的表,這段代碼並不考慮$ 3,現在我需要考慮避免爲每個塊創建一個新文件。這可能是可能的,因爲考慮到$ 4中的值不是consec如果他們不代表同一個區塊($ 3)?

謝謝

+0

至少對我而言,並不清楚您希望$ 3如何影響處理。另外,將文件分類的費用(減$ 3和$ 4,反之亦然)是可以接受的嗎? – peak

+0

$ 3上的值表示$ 4上的值對應的組。許多團隊3美元,價值4美元。問題是,4美元的價值是不連續的,這意味着一個團體可能結束1000,但另一個團體將從100開始。 – Ale

回答

1

awk來救援! 只需使用$ 3即可限定以前的值。

$ awk 'NR<3; NR==2{pv[$3]=$4} NR>2 && ($4-pv[$3]>=100){print;pv[$3]=$4}' file 

id  tag  xxx position score 
id_1 aaaaaaa bbbbb 3190 1 
id_3 aaaaaaa bbbbb 3300 1 
id_5 aaaaaaa ccccc 100 1 
id_6 aaaaaaa ccccc 500 1 

即改變pvpv[$3]。您可以將輸出傳送到column -t以獲得更好的格式,或將打印更改爲printf。

+0

哦,男人,這是如此簡單,我感到羞恥哈。謝謝 – Ale

0

如果你想要一個固定的列大小,爲什麼不是一個簡單的printf?

spc=10; 
while read a b c d e; do 
     printf '%-'$spc's %-'$spc's %-'$spc's %-'$spc's %-'$spc's\n' $a $b $c $d $e; 
done < file 

spc定義的空間列

輸出之間的數字:

id   tag  xxx  position score  
id_1  aaaaaaa bbbbb  3190  1   
id_2  aaaaaaa bbbbb  3199  1   
id_3  aaaaaaa bbbbb  3300  1   
id_4  aaaaaaa bbbbb  3350  1   
id_5  aaaaaaa ccccc  100  1   
id_6  aaaaaaa ccccc  500  1   
id_7  aaaaaaa ccccc  550  1   
id_8  aaaaaaa ccccc  599  1