Bash 比较a';具体';列,如果';具体';柱匹配
我有一个以制表符分隔的文件,有三列(GO ID、Biological process、Gene),我想比较第三列的行,如果它们匹配,我想连接它们各自的第一列和第二列。我是一个新手,我尝试了很多无效的方法,但没有得到我想要的结果 以下是所需输出的示例 输入 输出: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: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