Bash 插入下一个序列号+;awk中缺少行的默认值
我有下表(实际文件要大得多-2gb): mwe.txtBash 插入下一个序列号+;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
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 '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