我想以一种重复的方式转换表格 第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,基于我的基础知识,我重写了这里给出的代码:
#! /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中聚合使用。
由于
答案 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,首先交换并标记单独的字段。然后比较相邻行中的第一个字段,如果它们匹配,则将第二个字段中的第二个字段标记为由|
分隔的第一行。重复直到没有其他相邻行具有重复的第一个字段然后打印出文件。