2017-05-24 16 views
0

我有由空間像這樣波紋管分隔的4個列的文件:如何在awk的另一個字段中查找模式並進行操作?

1_86500000 50 1_87500000 19 
1_87500000 13 1_89500000 42 
1_89500000 25 1_90500000 10 
1_90500000 3 1_91500000 11 
1_91500000 23 1_92500000 29 
1_92500000 34 1_93500000 4 
1_93500000 39 1_94500000 49 
1_94500000 35 1_95500000 26 
2_35500000 1 2_31500000 81 
2_31500000 12 2_4150000 50 

,第一和第三列不同相,所以我不能將一個由另一個的值。 由於只有兩個或一個可能的列$ 1或$ 3,解決方案將查找該模式並將其值分配到另一列中,或者將其設置爲0,如果沒有像這樣的預期結果顯示:

P.S.這個預期結果中的第二個領域僅僅是爲了說明這個部門。

1_86500000 0/50 0 
1_87500000 19/13 1.46154 
1_89500000 42/25 1.68 
1_90500000 10/3 3.333 
1_91500000 11/23 0.47826 
1_92500000 29/34 0.85294 
1_93500000 4/39 0.10256 
1_94500000 49/35 1.4 
2_35500000 0/1 0 
2_31500000 81/12 6.75 
2_4150000 50/0 50 

我除此之外沒有自己存檔任何東西。所以我現在沒有任何起點。

我試着分開與_合併的字段,以查看是否可以通過減去座標來匹配。如果我得到0意味着列是在階段和正確的。但我無法走得更遠。

awk '{if(($5-$2)==0) print $1,$2,$3,$4,$5,$6}' file 

我試圖同時匹配列,但我只得到了階段性成果:

awk '{if(($1==$3)) print $1,$4/$2}' file 

你能幫助我嗎?

+0

你到目前爲止解決問題的方法是什麼?我相信你可以展示一些awk代碼 – fedorqui

+0

看我編輯的代碼 –

回答

1

awk來救援!

$ awk '{d[$1]=$2; n[$3]=$4} 
    END {for(k in n) 
      if(k in d) {print k,n[k]"/"d[k],n[k]/d[k]; delete d[k]} 
      else print k,n[k]"/0",n[k]; 
     for(k in d) print k,"0/"d[k],0}' file | sort 

1_86500000 0/50 0 
1_87500000 19/13 1.46154 
1_89500000 42/25 1.68 
1_90500000 10/3 3.33333 
1_91500000 11/23 0.478261 
1_92500000 29/34 0.852941 
1_93500000 4/39 0.102564 
1_94500000 49/35 1.4 
1_95500000 26/0 26 
2_31500000 81/12 6.75 
2_35500000 0/1 0 
2_4150000 50/0 50 

你的師零結果雖然有點奇怪!

說明保留兩個分子和分母的數組。一旦掃描完文件,請仔細檢查分子數組並找到相應的分母並進行分割。對於未使用的分母應用所給的慣例。

+0

非常感謝!你的解決方案工作得很好。謝謝你的解釋。 0除法很奇怪,但我認爲只是將它定義爲零。 Karakfa你應該有一個awk英雄t恤。 –

相關問題