Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 比较a';具体';列,如果';具体';柱匹配_Bash_File_Perl - Fatal编程技术网

Bash 比较a';具体';列,如果';具体';柱匹配

Bash 比较a';具体';列,如果';具体';柱匹配,bash,file,perl,Bash,File,Perl,我有一个以制表符分隔的文件,有三列(GO ID、Biological process、Gene),我想比较第三列的行,如果它们匹配,我想连接它们各自的第一列和第二列。我是一个新手,我尝试了很多无效的方法,但没有得到我想要的结果 以下是所需输出的示例 输入 输出: GO:0007155;GO:0022610 cell adhesion;biological adhesion ACHE GO:0007155;GO:0022610 cell adhesion;biologica

我有一个以制表符分隔的文件,有三列(GO ID、Biological process、Gene),我想比较第三列的行,如果它们匹配,我想连接它们各自的第一列和第二列。我是一个新手,我尝试了很多无效的方法,但没有得到我想要的结果

以下是所需输出的示例

输入

输出:

GO:0007155;GO:0022610      cell adhesion;biological adhesion   ACHE
GO:0007155;GO:0022610      cell adhesion;biological adhesion   ADAM19
GO:0007155;GO:0022610      cell adhesion;biological adhesion   AMBN

我为您的数据制作了一个以制表符分隔的副本

$: cat cols
GO:0007155      cell adhesion   ACHE
GO:0022610      biological adhesion     ACHE
GO:0007155      cell adhesion   ADAM19
GO:0022610      biological adhesion     ADAM19
GO:0007155      cell adhesion   AMBN
GO:0022610      biological adhesion     AMBN

$: declare -A A B C # associative arrays - "lookup tables"
$: tab=$'\t'        # just to make it easier to see it embedded
$: while IFS=$'\t' read a b c
   do A[$c]="${A[$c]};$a"
      B[$c]="${B[$c]};$b"
   done < cols      # stack cols
$: for c in "${!A[@]}"
   do echo "${A[$c]#;}$tab${B[$c]#;}$tab$c" # strip leading semicolons
   done
GO:0007155;GO:0022610   cell adhesion;biological adhesion       ADAM19
GO:0007155;GO:0022610   cell adhesion;biological adhesion       AMBN
GO:0007155;GO:0022610   cell adhesion;biological adhesion       ACHE

一种方法是使用非常有用的工具,再加上一些按摩,以获得所需格式的输出:

$ datamash -g 3 collapse 1 collapse 2 < input.tsv | \
   awk 'BEGIN { FS=OFS="\t" } { print $2, $3, $1 }' | tr , ';'   
GO:0007155;GO:0022610   cell adhesion;biological adhesion   ACHE
GO:0007155;GO:0022610   cell adhesion;biological adhesion   ADAM19
GO:0007155;GO:0022610   cell adhesion;biological adhesion   AMBN

欢迎来到SO。Stack Overflow是一个面向专业和热心程序员的问答网站。目标是在问题中添加一些自己的代码,以显示您自己为解决此问题所做的研究工作。制表符分隔?因为看起来你的第三列是“粘着”,哈哈;)是的,是以制表符分隔的,第二列是一个生物过程,第三列是与之相关的基因。
$: for c in $( printf "%s\n" "${!A[@]}" | sort )
   do echo "${A[$c]#;}$tab${B[$c]#;}$tab$c"
   done
$ datamash -g 3 collapse 1 collapse 2 < input.tsv | \
   awk 'BEGIN { FS=OFS="\t" } { print $2, $3, $1 }' | tr , ';'   
GO:0007155;GO:0022610   cell adhesion;biological adhesion   ACHE
GO:0007155;GO:0022610   cell adhesion;biological adhesion   ADAM19
GO:0007155;GO:0022610   cell adhesion;biological adhesion   AMBN
$ perl -F"\t" -lane 'push @{$genes{$F[2]}}, [@F[0,1]];
                     END { $,="\t";
                           for (sort keys %genes) {
                             print join(";", map { $_->[0] } @{$genes{$_}}),
                                   join(";", map { $_->[1] } @{$genes{$_}}),
                                   $_ } }' input.tsv
GO:0007155;GO:0022610   cell adhesion;biological adhesion   ACHE
GO:0007155;GO:0022610   cell adhesion;biological adhesion   ADAM19
GO:0007155;GO:0022610   cell adhesion;biological adhesion   AMBN