Awk 查找第1列中的所有元素,其中第2列为x

Awk 查找第1列中的所有元素,其中第2列为x,awk,Awk,我有一个2x14000000数据帧,其中第1列是一系列(基本上)唯一的元素,第2列是重复的 示例.数据: rs564192510 TRIT1 rs564192510 MYCL rs146746778 NFIA rs142596889 KIAA1614 rs142596889 XPR1 rs4437820 NOC2L rs7542092 NOC2L rs28444699 NOC2L 我正在寻找一个(最好是awk?)命令,它

我有一个2x14000000数据帧,其中第1列是一系列(基本上)唯一的元素,第2列是重复的

示例.数据:

rs564192510     TRIT1
rs564192510     MYCL
rs146746778     NFIA
rs142596889     KIAA1614
rs142596889     XPR1
rs4437820       NOC2L
rs7542092       NOC2L
rs28444699      NOC2L
我正在寻找一个(最好是awk?)命令,它将拉出第二列中的唯一元素,并在第二列之后写入第一列中相应元素的所有元素。因此,例如.data,您将得到下面的output.data:

结果.数据:

TRIT1    rs564192510     
MYCL     rs564192510     
NFIA     rs146746778
KIAA1614 rs142596889
XPR1     rs142596889
NOC2L    rs4437820 rs7542092 rs28444699   

我最初尝试在R中使用melt和Reforme来实现这一点,但数据帧太长,无法轻松处理。

也许不是最优雅的,但这应该可以实现

#! /bin/sh -u

previous=""
while read ln; do
    line=( $ln )
    if [ $line[1] == $previous ]; then
        printf " %s " "${line[0]}"
    else
        printf "\n%-10s %s " "${line[1]}" "${line[0]}"
        previous=$line[1]
    fi
done < /dev/stdin
#/bin/sh-u
上一个=“”
读ln时;做
行=($ln)
如果[$line[1]==$previous];然后
printf“%s”${line[0]}
其他的
printf“\n%-10s%s”“${line[1]}”“${line[0]}”
上一行=$line[1]
fi
完成
awk救命

 awk -vOFS="\t" '{a[$2]=a[$2]?a[$2] FS $1:$1} END{for(i in a)print i OFS a[i]}'

连接由字段2索引的数组中的值。用于第一个元素的特殊字符,以消除额外的字段分隔符。

perl-ane'if($F[1]ne$p){print“\n$F[1]”;$p=$F[1]}print“$F[0]”;结束{print“\n”}
这项工作既快又好。请写一个答案,这样我可以信任你!所以你只想找人帮你写代码?这就是你被否决的原因。stackoverflow不是“为我编写代码”服务。让我们来看看。