2015-12-03 20 views
0

缺少的行,我有以下表(真正的文件要大得多 - 2GB):插入序列+默認值的下一個數爲AWK

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 

不幸的是如果第3列和第4列爲零,此表中未打印任何行。我想這些缺少的行插入的,具有:

  • 在列3的「0」和4
  • 上一行列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 

其輸出以下:

output.txt的

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 

,你可以看,它不會將第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 
+1

這是一個很小的變化,瞭解你所使用的代碼一樣。 – 123

回答

3

awk解決方案:

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 

結果

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 
+0

一些調整以獲得確切的期望輸出: 'awk'BEGIN {print「mCoord \ tchr \ tcoord \ tsamp1 \ tsamp2」;} NR> 1 && $ 2!= exp_idx {for(i = exp_idx; i <$ 2; i ++ ){printf(「%d \ t%s \ t%d \ t0 \ t0 \ n」,++ cont,exp_coord,i)}} {print ++ cont「\ t」$ 0; exp_coord = $ 1; exp_idx = $ 2 + 1}'mwe.txt' – Shearn

0

Perl的解決方案:

perl -lpae '@p [email protected] F, next if 1 == $.; 
      print "$p[0] $_ 0 0" for $p[1] + 1 .. $F[1] - 1; 
      @p = @F 
      ' input > output 

它只是記得在@p前行的列。