2017-08-11 35 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

我不明白我在代码中必须写入'删除'的确切位置。 –