Bash 插入下一个序列号+;awk中缺少行的默认值

Bash 插入下一个序列号+;awk中缺少行的默认值,bash,awk,pipe,Bash,Awk,Pipe,我有下表(实际文件要大得多-2gb): mwe.txt X 7 1 3 X 8 1 4 X 9 1 6 X 13 2 8 X 14 2 8 X 15 3 8 X 19 6 10 X 20 6 11 Y 13 2 8 Y 14 2 8 Y 15 3 8 Y 19 6 10 Y 20 6 11 X 7 1 3 X 8 1 4 X 9

我有下表(实际文件要大得多-2gb):

mwe.txt

X   7   1   3
X   8   1   4
X   9   1   6
X   13  2   8
X   14  2   8
X   15  3   8
X   19  6   10
X   20  6   11
Y   13  2   8
Y   14  2   8
Y   15  3   8
Y   19  6   10
Y   20  6   11
X   7   1   3
X   8   1   4
X   9   1   6
X   10  0
X   11  0
X   12  0
X   13  2   8
X   14  2   8
X   15  3   8
X   16  0
X   17  0
X   18  0
X   19  6   10
X   20  6   11
Y   13  2   8
Y   14  2   8
Y   15  3   8
Y   16  0
Y   17  0
Y   18  0
Y   19  6   10
Y   20  6   11
不幸的是,如果第3列和第4列为零,则不会为此表打印任何行。我希望插入这些缺失的行,包括:

  • 第3列和第4列中的“0”
  • 第2列上一行之后的下一个序列号
  • 上一行中第1列的名称
  • 打印的页眉,以及
  • 作为附加列添加的行号
我希望能够用管道输送,所以我希望尽可能快。我从awk开始,为此我找到了类似问题的代码:

awk 'BEGIN { prev_chr="";prev_pos=0;} { if($1==prev_chr && prev_pos+1!=int($2)) {for(i=prev_pos+1;i<int($2);++i) {printf("%s\t%d\t0\n",$1,i);}} print; prev_chr=$1;prev_pos=int($2);}' mwe.txt > output.txt
如您所见,它不会在第4列中为缺少的行添加零

简而言之,所需的输出:

mCoord  chr coord   samp1   samp2
1   X   7   1   3
2   X   8   1   4
3   X   9   1   6
4   X   10  0   0
5   X   11  0   0
6   X   12  0   0
7   X   13  2   8
8   X   14  2   8
9   X   15  3   8
10  X   16  0   0
11  X   17  0   0
12  X   18  0   0
13  X   19  6   10
14  X   20  6   11
15  Y   13  2   8
16  Y   14  2   8
17  Y   15  3   8
18  Y   16  0   0
19  Y   17  0   0
20  Y   18  0   0
21  Y   19  6   10
22  Y   20  6   11
Perl解决方案:

perl -lpae '@p =@ F, next if 1 == $.;
            print "$p[0]   $_   0   0" for $p[1] + 1 .. $F[1] - 1;
            @p = @F
           ' input > output
awk 'NR>1 && $2!=exp_idx{
         for (i=exp_idx;i<$2;i++){
            printf("%d  %s   %d  0   0\n",++cont,exp_coord,i)
         }

     }
     {print ++cont"  "$0;exp_coord=$1;exp_idx=$2+1}
    ' input
它只记得@p中前一行的列。

Perl解决方案:

perl -lpae '@p =@ F, next if 1 == $.;
            print "$p[0]   $_   0   0" for $p[1] + 1 .. $F[1] - 1;
            @p = @F
           ' input > output
awk 'NR>1 && $2!=exp_idx{
         for (i=exp_idx;i<$2;i++){
            printf("%d  %s   %d  0   0\n",++cont,exp_coord,i)
         }

     }
     {print ++cont"  "$0;exp_coord=$1;exp_idx=$2+1}
    ' input

它只记得@p中前一行的列。

一个
awk
解决方案:

perl -lpae '@p =@ F, next if 1 == $.;
            print "$p[0]   $_   0   0" for $p[1] + 1 .. $F[1] - 1;
            @p = @F
           ' input > output
awk 'NR>1 && $2!=exp_idx{
         for (i=exp_idx;i<$2;i++){
            printf("%d  %s   %d  0   0\n",++cont,exp_coord,i)
         }

     }
     {print ++cont"  "$0;exp_coord=$1;exp_idx=$2+1}
    ' input

awk
解决方案:

perl -lpae '@p =@ F, next if 1 == $.;
            print "$p[0]   $_   0   0" for $p[1] + 1 .. $F[1] - 1;
            @p = @F
           ' input > output
awk 'NR>1 && $2!=exp_idx{
         for (i=exp_idx;i<$2;i++){
            printf("%d  %s   %d  0   0\n",++cont,exp_coord,i)
         }

     }
     {print ++cont"  "$0;exp_coord=$1;exp_idx=$2+1}
    ' input

这是一个小改动,了解您正在使用的代码的功能。这是一个小改动,了解您正在使用的代码的功能。进行一些调整以获得准确的所需输出:
awk'BEGIN{print“mCoord\tchr\tcoord\tsamp1\tsamp2”}NR>1&$2=exp_idx{for(i=exp_idx;等轴调整以获得准确的所需输出:
awk'BEGIN{print“mCoord\tchr\tcord\tsamp1\tsamp2”}NR>1&$2!=exp_idx{for(i=exp_idx;i