2017-08-11 52 views
-1

我有一個表格文件等比較在不同的列兩個陣列中用於使用UNIX

COL1 COL2每行一個文件和打印匹配元件6 29 61 63 67 70 133 134 150 159 166 208 220 260 261 262 303 312 316 327 330 349 378 387 396 408 415 454 465 V 260 135 49 159

等等高達千行。

分爲五列。我已經通過拆分(空格分隔符)將數組中的第三列和第五列進行了轉換,以便比較它們並打印匹配數字。不過,我已經嘗試了不同的方法,但沒有結果,下面的代碼

awk 'BEGIN {FS=OFS="\t"} { allpos=split($3,arr1," "); posSNP=split($5,arr2," "); { for (j in arr2) {for (i in arr1) { if (arr2[j] == arr1[i]) {printf "%s ", i arr1[i]}} printf "\n"}}}' "input" > "output"; 

和類似的代碼。

我的期望輸出和會是這樣的:

COL1 COL2五:159 - 260

我怎樣才能得到它在UNIX環境?在此先感謝

+1

請格式化您的問題,以便輸入和輸出數據更容易理解。有多少列?另外,您需要描述如何計算輸出。 –

+0

輸入是一個列表file.tsv,其中有五列。第三列和第五列是一組數字,並將比較它們之間的所有數字,並將每一行記錄到output.tsv文件中。總之,第一列和第二列保留在輸出中。 tsv文件以相同的方式,第三列將爲每行分隔的匹配數字。我希望我更正確地解釋input.tsv文件和所需的output.tsv文件。在此先感謝 –

+1

編輯您的問題以呈現列表中的輸入文件,以便它看起來像它應該是什麼。 –

回答

0

散列查找將更快,您可以進一步優化通過使用長度來選擇散列的一個。

awk 'BEGIN {FS=OFS="\t"}                 
      {n=split($3,a3," "); 
      m=split($5,a5," "); 
      for(i=1;i<=m;i++) a[a5[i]]; 
      SEP="" 
      for(i=1;i<=n;i++) if(a3[i] in a) {both=both SEP a3[i]; SEP="-"} 
      print $1,$2,$4 ":" both }' file 

col1 col2 V:159-260 
+0

感謝您解決問題。事實上,它的工作原理和打印比賽。然而,有一千行,我會採取每一行,而不考慮前一行。現在輸出累積每行中的所有重合,所以新行具有它們的匹配和先前的匹配。我該如何解決這個問題? –

+0

在第一個「拆分」之前添加'刪除' – karakfa

+0

我不明白我在代碼中必須寫入'刪除'的確切位置。 –