Bash 比较文件中不同列中的两个数组,并使用unix打印每行的匹配元素

Bash 比较文件中不同列中的两个数组,并使用unix打印每行的匹配元素,bash,unix,awk,Bash,Unix,Awk,我有一个列表文件,比如 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 以此类推,多达数千行 分成五列。我已经通过split(空格分隔符)转换了数组中的第三列和第五列,以便比较它们并打印匹配的数字。但是,我尝试了不同的方法,但没有通过下面的代码得到结果 awk 'BEGIN

我有一个列表文件,比如

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

以此类推,多达数千行

分成五列。我已经通过split(空格分隔符)转换了数组中的第三列和第五列,以便比较它们并打印匹配的数字。但是,我尝试了不同的方法,但没有通过下面的代码得到结果

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 V:159-260


如何在unix环境中获取它?提前感谢

散列查找会更快,您可以通过使用长度来选择散列的一个来进一步优化

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
awk'BEGIN{FS=OFS=“\t”}
{n=拆分($3,a3,“”);
m=拆分($5,a5,“”);

对于(i=1;i请格式化您的问题,使输入和输出数据更容易理解。有多少列?此外,您需要描述如何计算输出。输入是一个表格文件.tsv,其中有五列。第三列和第五列是一组数字,将比较每行的所有数字文件并在output.tsv文件中打印匹配的数字。总之,第一列和第二列将以相同的方式保留在output.tsv文件中,第三列将是每行分隔的匹配数字。我希望我能更正确地解释input.tsv文件和所需的output.tsv文件。提前感谢将您的问题编辑到pres输入制表的输入文件,这样它实际上看起来就像它应该的样子。感谢您解决了这个问题。事实上,它可以工作并打印匹配项。但是有数千行,我会在不考虑前一行的情况下获取每一行。现在,输出会在每一行中累积所有的一致性,以便新行具有它们的匹配项和以前的匹配。如何解决此问题?在第一次“拆分”之前添加“删除a”。我不知道我必须在代码中写入“删除a”的确切位置抱歉。