2015-12-11 61 views
0

比較不同的領域我想在連續行不同領域的比較,如:連續的行上

TYPE DATE  TOTAL 
p1  xxxx  1 
p2  xxxx  2 
p3  xxxx  1 
p3  xxxx  2 
p3  xxxx  1 
p4  xxxx  2 
p5  xxxx  1 
p5  xxxx  2 
p5  xxxx  1 

我想一個腳本,將首先考慮「總計」爲= 1,那麼它會尋找一個條目轉換爲列類型,只要P與遇到1的條目保持一致,就需要將其輸出到文件中。

結果舉例:

p1 xxxx 1 
p3 xxxx 1 
p3 xxxx 2 
p3 xxxx 1 
p5 xxxx 1 
p5 xxxx 2 
p5 xxxx 1 

我嘗試使用bash這一點,但代碼是超級慢,有另一種方式做到這一點?

temp=AAAAA 

而讀出線 做 類型= $ {線:20:1} 莢= $ {行:0:2} 日期= $ {線:9:5}

if [ "$type" != "2" ] 
then 
    echo $line >> outfile 
fi 

if [ "$POD" == "temp" ] 
then 
    echo line >> outfile 
fi 

temp=POD 

done<$1 
+3

顯示bash腳本 – 123

回答

1
$ awk '$NF==1{t=$1} $1==t' file 
p1  xxxx  1 
p3  xxxx  1 
p3  xxxx  2 
p3  xxxx  1 
p5  xxxx  1 
p5  xxxx  2 
p5  xxxx  1 

以上將在眨眼間運行,並會在所有awks穩健運行。

說一個bash腳本處理文本很慢就像是說你的自行車在讓你工作30英里的速度很慢。當然,它很慢,這不是它設計的目的。 shell用於處理文件和進程,並將調用排序到工具,而不是用於處理文本。用於處理文本的UNIX工具是awk - 這就是你應該使用的。獲取Arnold Robbins編寫的第4版Effective Awk編程。

+0

親愛的駕駛者downvoter - 關心澄清爲什麼你downvoted正確的答案? –

-1
awk '{if($3==1){a=$1}if($1==a){print}}' your_file 
+0

在'1'出現之前不會打印相同的'p' – 123

+0

我的理解不正確嗎?該OP說:「我想要一個腳本,最初將查看」彙總「的條目= 1」 – Vijay

0
#initialize 
temp=AAAAA 
check=0 

#loop per line 
while read line 
do 
type=${line:20:1} 
pod=${line:0:2} 
date=${line:9:5} 

if [ "$type" != "2" ] 
then 
    echo "$line" >> outfile 
    check=1   #if condition true then flag=1 
fi 

if [ "$pod" == "$temp" ] 
then 
    if [ $check -ne 1 ] #if flag=1 dont print - otherwise it prints twice 
    then 
    echo "$line" >> outfile 
    fi 
fi 

temp=$pod 
check=0 
done<$1 

最好的我管理得如此肥胖,但如此痛苦緩慢。我想,每轉4個IFS做到這一點:/

+1

它也會破壞你的輸出給定的各種輸入值。 Shell不是用來操縱文本的 - 這就是爲什麼它非常緩慢並且難以置信地難以強有力地寫出來做這件事。 –