使用AWK将相似的连续行追加到一个较长的行中

使用AWK将相似的连续行追加到一个较长的行中,awk,Awk,我有一个7列的大文本文件,其中的行排序如下: gi|352964122|gb|JH286168.1| 00884 C C 14 1.00 u gi|352964122|gb|JH286168.1| 00884 C C 26 0.76 p gi|352964122|gb|JH286168.1| 00884 C C 33 0.89 f gi|352964122|gb|JH286168.1| 00885 G G 14 1.00

我有一个7列的大文本文件,其中的行排序如下:

gi|352964122|gb|JH286168.1| 00884 C C 14   1.00         u
gi|352964122|gb|JH286168.1| 00884 C C 26   0.76         p
gi|352964122|gb|JH286168.1| 00884 C C 33   0.89         f
gi|352964122|gb|JH286168.1| 00885 G G 14   1.00         u
gi|352964122|gb|JH286168.1| 00885 A A 30   0.84         f
gi|352964122|gb|JH286168.1| 00886 T T 31   0.81         f
gi|352964122|gb|JH286168.1| 00884 C C 14   1.00 u C C 26 0.76 p C C 33   0.89 f
gi|352964122|gb|JH286168.1| 00885 G G 14   1.00 u -  -  -  ------------     G G 33   0.89 f
gi|352964122|gb|JH286168.1| 00886 T T 31   0.81 f - -  -  ----        - -   -  ------ -  -   --   -----   -   -
我需要做的是,如果前两列在连续行中相同,则将其余列追加到第一行。可以有1行、2行或3行“相似”,如果少于3行,我需要占位符来保持列的完整性。因此,上述情况如下所示:

gi|352964122|gb|JH286168.1| 00884 C C 14   1.00         u
gi|352964122|gb|JH286168.1| 00884 C C 26   0.76         p
gi|352964122|gb|JH286168.1| 00884 C C 33   0.89         f
gi|352964122|gb|JH286168.1| 00885 G G 14   1.00         u
gi|352964122|gb|JH286168.1| 00885 A A 30   0.84         f
gi|352964122|gb|JH286168.1| 00886 T T 31   0.81         f
gi|352964122|gb|JH286168.1| 00884 C C 14   1.00 u C C 26 0.76 p C C 33   0.89 f
gi|352964122|gb|JH286168.1| 00885 G G 14   1.00 u -  -  -  ------------     G G 33   0.89 f
gi|352964122|gb|JH286168.1| 00886 T T 31   0.81 f - -  -  ----        - -   -  ------ -  -   --   -----   -   -
我用AWK尝试了很多方法,但都不太明白。如何做到这一点?

这应该做到: (编辑:我没有注意到您需要占位符。我会调查一下……)

这应该做到: (编辑:我没有注意到您需要占位符。我会调查一下……)

这应该做到: (编辑:我没有注意到您需要占位符。我会调查一下……)

这应该做到: (编辑:我没有注意到您需要占位符。我会调查一下……)


我不确定你是如何获得第二排成绩的,但这至少符合我对目标的理解:

awk '
{
  head=$1 " " $2
  tail=$3 " " $4 " " $5 " " $6 " "$7
  if(previous!=head) {
    if(previous!="") printf("%s %s %s %s\n",previous,p[1],p[2],p[3])
    previous=head
    i=1
    p[i]=tail
    p[2]=p[3]="- - - -"
  } else {
    i=i+1
    p[i]=tail
  }
}
END { printf("%s %s %s %s\n",previous,p[1],p[2],p[3]) }'
输出:

gi|352964122|gb|JH286168.1| 00884 C C 14 1.00 u C C 26 0.76 p C C 33 0.89 f
gi|352964122|gb|JH286168.1| 00885 G G 14 1.00 u A A 30 0.84 f - - - -
gi|352964122|gb|JH286168.1| 00886 T T 31 0.81 f - - - - - - - -

我不确定你是如何获得第二排成绩的,但这至少符合我对目标的理解:

awk '
{
  head=$1 " " $2
  tail=$3 " " $4 " " $5 " " $6 " "$7
  if(previous!=head) {
    if(previous!="") printf("%s %s %s %s\n",previous,p[1],p[2],p[3])
    previous=head
    i=1
    p[i]=tail
    p[2]=p[3]="- - - -"
  } else {
    i=i+1
    p[i]=tail
  }
}
END { printf("%s %s %s %s\n",previous,p[1],p[2],p[3]) }'
输出:

gi|352964122|gb|JH286168.1| 00884 C C 14 1.00 u C C 26 0.76 p C C 33 0.89 f
gi|352964122|gb|JH286168.1| 00885 G G 14 1.00 u A A 30 0.84 f - - - -
gi|352964122|gb|JH286168.1| 00886 T T 31 0.81 f - - - - - - - -

我不确定你是如何获得第二排成绩的,但这至少符合我对目标的理解:

awk '
{
  head=$1 " " $2
  tail=$3 " " $4 " " $5 " " $6 " "$7
  if(previous!=head) {
    if(previous!="") printf("%s %s %s %s\n",previous,p[1],p[2],p[3])
    previous=head
    i=1
    p[i]=tail
    p[2]=p[3]="- - - -"
  } else {
    i=i+1
    p[i]=tail
  }
}
END { printf("%s %s %s %s\n",previous,p[1],p[2],p[3]) }'
输出:

gi|352964122|gb|JH286168.1| 00884 C C 14 1.00 u C C 26 0.76 p C C 33 0.89 f
gi|352964122|gb|JH286168.1| 00885 G G 14 1.00 u A A 30 0.84 f - - - -
gi|352964122|gb|JH286168.1| 00886 T T 31 0.81 f - - - - - - - -

我不确定你是如何获得第二排成绩的,但这至少符合我对目标的理解:

awk '
{
  head=$1 " " $2
  tail=$3 " " $4 " " $5 " " $6 " "$7
  if(previous!=head) {
    if(previous!="") printf("%s %s %s %s\n",previous,p[1],p[2],p[3])
    previous=head
    i=1
    p[i]=tail
    p[2]=p[3]="- - - -"
  } else {
    i=i+1
    p[i]=tail
  }
}
END { printf("%s %s %s %s\n",previous,p[1],p[2],p[3]) }'
输出:

gi|352964122|gb|JH286168.1| 00884 C C 14 1.00 u C C 26 0.76 p C C 33 0.89 f
gi|352964122|gb|JH286168.1| 00885 G G 14 1.00 u A A 30 0.84 f - - - -
gi|352964122|gb|JH286168.1| 00886 T T 31 0.81 f - - - - - - - -
$cat tst.awk
开始{maxRecs=3}
功能prta(i,dflt){
dflt=a[1]
gsub(/[^[:space:]+/,“-”,dflt)
printf“%s”,键
对于(i=1;i
$cat tst.awk
开始{maxRecs=3}
功能prta(i,dflt){
dflt=a[1]
gsub(/[^[:space:]+/,“-”,dflt)
printf“%s”,键
对于(i=1;i
$cat tst.awk
开始{maxRecs=3}
功能prta(i,dflt){
dflt=a[1]
gsub(/[^[:space:]+/,“-”,dflt)
printf“%s”,键
对于(i=1;i
$cat tst.awk
开始{maxRecs=3}
功能prta(i,dflt){
dflt=a[1]
gsub(/[^[:space:]+/,“-”,dflt)
printf“%s”,键


对于(i=1;i)列出一些您尝试过的代码,并解释其不起作用的原因。目前尚不清楚字段的显示顺序是如何确定的,也不清楚“占位符”的规则.你能解释一下吗?我不明白你是如何放置占位符的。在输出的第二行中,
g330.89f
是从哪里来的。“a30”是从哪里来的go?发布一些您尝试过的代码,并解释为什么它不起作用。目前还不清楚字段的显示顺序是如何确定的,也不清楚“占位符”的规则.你能解释一下吗?我不明白你是如何放置占位符的。在输出的第二行中,
g330.89f
是从哪里来的。“a30”是从哪里来的go?发布一些您尝试过的代码,并解释为什么它不起作用。目前还不清楚字段的显示顺序是如何确定的,也不清楚“占位符”的规则.你能解释一下吗?我不明白你是如何放置占位符的。在输出的第二行中,
g330.89f
是从哪里来的。“a30”是从哪里来的go?发布一些您尝试过的代码,并解释为什么它不起作用。目前还不清楚字段的显示顺序是如何确定的,也不清楚“占位符”的规则.你能解释一下吗?我不明白你是如何放置占位符的。在输出的第二行中,
g330.89f
是从哪里来的。“a30”是从哪里来的开始?我感谢你的帮助!我很抱歉花了这么长时间才解决我的问题,但是这个经过一点调整的解决方案对我来说非常有效。谢谢你的反馈,迟做总比不做好!我感谢你的帮助!我很抱歉花了这么长时间才解决我的问题,但是这个经过一点调整的解决方案对我来说非常有效。谢谢你的建议反馈,迟做总比不做强!我感谢你的帮助!很抱歉我花了这么长时间才解决我的问题,但这个稍加调整的解决方案对我来说非常有效。感谢你的反馈,迟做总比不做强!我感谢你的帮助!很抱歉我花了这么长时间才解决我的问题,但这个稍加调整的解决方案奏效了太好了。谢谢你的反馈,迟做总比不做好!