如何在一行中打印重复键列的字段

时间:2011-11-16 13:54:14

标签: awk

我想以一种重复的方式转换表格 第2列中的值将具有第1列中的相应值。

即。类似的东西...

MZ00024296  AC148152.3_FG005

MZ00047079  AC148152.3_FG006

MZ00028122  AC148152.3_FG008

MZ00032922  AC148152.3_FG008

MZ00048218  AC148152.3_FG008

MZ00024680  AC148167.6_FG001

MZ00013456  AC149475.2_FG003

AC148152.3_FG005    MZ00024296

AC148152.3_FG006    MZ00047079

AC148152.3_FG008    MZ00028122|MZ00032922|MZ00048218

AC148167.6_FG001 MZ00024680

AC149475.2_FG003 MZ00013456

因为我需要它在R中的计算我尝试使用:

x=aggregate(mz_grmz,by=list(mz_grmz[,2]),FUN=paste(mz_grmz[,1],sep="|"))

但它不起作用(功能错误) match.fun(FUN)出错:   'paste(mz_grmz [,1],sep =“|”)'不是函数,字符或符号

我还提醒自己有关unstack()函数,但这不是我需要的。

我尝试使用awk,基于我的基础知识,我重写了这里给出的代码:

site1

#! /bin/sh
for y do
awk -v FS="\t" '{
for (x=1;x<=NR;x++) {
    if (NR>2 && x=x+1) {
    print $2"\t"x
    }
    else {print NR}
}
}' $y > $y.2
done

不幸的是它不起作用,它只生成带有字段#2和一些数字的巨大文件。

我认为这很容易,但现在已经超出了我的技能。 有人可以给我一个暗示吗?也许只是函数在R中聚合使用。

由于

3 个答案:

答案 0 :(得分:1)

你可以用awk这样做:

awk '
    {
        if ($2 in a)
            a[$2] = a[$2] "|" $1
        else
            a[$2] = $1
    }
    END {
        for (i in a)
            print i, a[i]
    }' INFILE > OUTFILE

答案 1 :(得分:0)

保持输出与问题中的文本相同(空行等):

awk '{if($0 &&($2 in a))a[$2]=a[$2]"|"$1;else if ($0) a[$2]=$1;}\
END{for(x in a){print x,a[x];print ""}}' inputFile

<强>测试

kent$  echo "MZ00024296  AC148152.3_FG005

MZ00047079  AC148152.3_FG006

MZ00028122  AC148152.3_FG008

MZ00032922  AC148152.3_FG008

MZ00048218  AC148152.3_FG008

MZ00024680  AC148167.6_FG001

MZ00013456  AC149475.2_FG003"|awk '{if($0 &&($2 in a))a[$2]=a[$2]"|"$1;else if ($0) a[$2]=$1;}END{for(x in a){print x,a[x];print ""}}'
AC149475.2_FG003 MZ00013456

AC148152.3_FG005 MZ00024296

AC148152.3_FG006 MZ00047079

AC148152.3_FG008 MZ00028122|MZ00032922|MZ00048218

AC148167.6_FG001 MZ00024680

答案 2 :(得分:0)

这个GNU sed解决方案可能适合您:

 sed -r '1{h;d};H;${x;s/(\S+)\s+(\S+)/\2\t\1/g;:a;s/(\S+\t)([^\n]*)(\n+)\1([^\n]*)\n*/\1\2|\4\3/;ta;p};d' input_file

说明:使用扩展的正则表达式选项-r使正则表达式更具可读性。将整个文件读入保留空间(HS)。然后在文件结束时,切换到HS,首先交换并标记单独的字段。然后比较相邻行中的第一个字段,如果它们匹配,则将第二个字段中的第二个字段标记为由|分隔的第一行。重复直到没有其他相邻行具有重复的第一个字段然后打印出文件。