在一个列式文件中组合多个grep变量

问题描述 投票:0回答:3

我有一些grep表达式,它们计算匹配字符串的行数,每个表达式用于一组具有不同扩展名的文件:

Nreads_ini=$(grep -c '^>' $WDIR/*_R1.trim.contigs.fasta)
Nreads_align=$(grep -c '^>' $WDIR/*_R1.trim.contigs.good.unique.align)
Nreads_preclust=$(grep -c '^>' $WDIR/*_R1.trim.contigs.good.unique.filter.unique.precluster.fasta)
Nreads_final=$(grep -c '^>' $WDIR/*_R1.trim.contigs.good.unique.filter.unique.precluster.pick.fasta)

这些greps中的每一个都输出样本名称和出现次数,如下所示。

第一个:

PATH/V3_F357_N_V4_R805_1_A1_bach1_GTATCGTCGT_R1.trim.contigs.fasta:13175
PATH/V3_F357_N_V4_R805_1_A2_bach2_GAGTGATCGT_R1.trim.contigs.fasta:14801
PATH/V3_F357_N_V4_R805_1_A3_bach3_TGAGCGTGCT_R1.trim.contigs.fasta:13475
PATH/V3_F357_N_V4_R805_1_A4_bach4_TGTGTGCATG_R1.trim.contigs.fasta:13424
PATH/V3_F357_N_V4_R805_1_A5_bach5_TGTGCTCGCA_R1.trim.contigs.fasta:12053

第二个:

PATH/V3_F357_N_V4_R805_1_A1_bach1_GTATCGTCGT_R1.trim.contigs.good.unique.align:12589
PATH/V3_F357_N_V4_R805_1_A2_bach2_GAGTGATCGT_R1.trim.contigs.good.unique.align:13934
PATH/V3_F357_N_V4_R805_1_A3_bach3_TGAGCGTGCT_R1.trim.contigs.good.unique.align:12981
PATH/V3_F357_N_V4_R805_1_A4_bach4_TGTGTGCATG_R1.trim.contigs.good.unique.align:12896
PATH/V3_F357_N_V4_R805_1_A5_bach5_TGTGCTCGCA_R1.trim.contigs.good.unique.align:11617

等等。我需要使用这些数字grep输出创建一个.txt文件作为列,将样本名称作为键列。样本名称是“_R1”之前文件名的一部分(V3_F357_N_V4_R805_1_A5_bach5_TGTGCTCGCA,V3_F357_N_V4_R805_1_A4_bach4_TGTGTGCATG ...):

Sample                                   | Nreads_ini | Nreads_align  |
-----------------------------------------------------------------------
V3_F357_N_V4_R805_1_A1_bach1_GTATCGTCGT  | 13175      | 12589         | 
V3_F357_N_V4_R805_1_A2_bach2_GAGTGATCGT  | 14801      | 13934         | 
V3_F357_N_V4_R805_1_A3_bach3_TGAGCGTGCT  | 13475      | 12981         | 
V3_F357_N_V4_R805_1_A4_bach4_TGTGTGCATG  | 13424      | 12896         |
V3_F357_N_V4_R805_1_A5_bach5_TGTGCTCGCA  | 12053      | 11617         |

任何的想法?我的问题还有另一种更简单的解决方案吗谢谢!

bash count grep
3个回答
1
投票

在这个答案中,变量名缩短为inialign

首先,我们从grep的输出中提取样本名称和计数。由于我们必须多次执行此操作,因此我们定义了该函数

e() { sed -E 's,^.*/(.*)_R1.*:(.*)$,\1\t\2,'; }

然后我们将提取的数据加入到一个文件中。将合并具有相同样本名称的行。

join -t $'\t' <(e <<< "$ini") <(e <<< "$align")

现在我们几乎有了预期的产量。我们只需要为表添加标题和绘制线。

join ... | column -to " | " -N Sample,ini,align

这将打印

Sample                                  | ini   | align
V3_F357_N_V4_R805_1_A1_bach1_GTATCGTCGT | 13175 | 12589
V3_F357_N_V4_R805_1_A2_bach2_GAGTGATCGT | 14801 | 13934
V3_F357_N_V4_R805_1_A3_bach3_TGAGCGTGCT | 13475 | 12981
V3_F357_N_V4_R805_1_A4_bach4_TGTGTGCATG | 13424 | 12896
V3_F357_N_V4_R805_1_A5_bach5_TGTGCTCGCA | 12053 | 11617

在标题后添加一条水平线作为读者的练习:)

此方法也适用于两个以上的数字列。 join-N部分必须延长。 join只能使用两个文件,要求我们使用笨重的解决方法......

e() { sed -E 's,^.*/(.*)_R1.*:(.*)$,\1\t\2,'; }
join -t $'\t' <(e <<< "$var1") <(e <<< "$var2") |
join -t $'\t' - <(e <<< "$var3") | ... | join -t $'\t' - <(e <<< "$varN") |
column -to " | " -N Sample,Col1,Col2,...,ColN

...所以添加另一个辅助函数会更容易

e() { sed -E 's,^.*/(.*)_R1.*:(.*)$,\1\t\2,'; }
j2() { join -t $'\t' <(e <<< "$1") <(e <<< "$2"); }
j() { join -t $'\t' - <(e <<< "$1"); }
j2 "$var1" "$var2" | j "$var3" | ... | j "$varN" |
column -to " | " -N Sample,Col1,Col2,...,ColN

或者,如果所有输入包含相同顺序的相同样本,则可以使用单个join命令替换paste


0
投票

假设您有包含要解析的数据的文件:

$ cat file1
PATH/V3_F357_N_V4_R805_1_A1_bach1_GTATCGTCGT_R1.trim.contigs.fasta:13175
PATH/V3_F357_N_V4_R805_1_A2_bach2_GAGTGATCGT_R1.trim.contigs.fasta:14801
PATH/V3_F357_N_V4_R805_1_A3_bach3_TGAGCGTGCT_R1.trim.contigs.fasta:13475
PATH/V3_F357_N_V4_R805_1_A4_bach4_TGTGTGCATG_R1.trim.contigs.fasta:13424
PATH/V3_F357_N_V4_R805_1_A5_bach5_TGTGCTCGCA_R1.trim.contigs.fasta:12053
$ cat file2
PATH/V3_F357_N_V4_R805_1_A1_bach1_GTATCGTCGT_R1.trim.contigs.good.unique.align:12589
PATH/V3_F357_N_V4_R805_1_A2_bach2_GAGTGATCGT_R1.trim.contigs.good.unique.align:13934
PATH/V3_F357_N_V4_R805_1_A3_bach3_TGAGCGTGCT_R1.trim.contigs.good.unique.align:12981
PATH/V3_F357_N_V4_R805_1_A4_bach4_TGTGTGCATG_R1.trim.contigs.good.unique.align:12896
PATH/V3_F357_N_V4_R805_1_A5_bach5_TGTGCTCGCA_R1.trim.contigs.good.unique.align:11617
$ cat file3 # This is a copy of file2 but could be different
PATH/V3_F357_N_V4_R805_1_A1_bach1_GTATCGTCGT_R1.trim.contigs.good.unique.align:12589
PATH/V3_F357_N_V4_R805_1_A2_bach2_GAGTGATCGT_R1.trim.contigs.good.unique.align:13934
PATH/V3_F357_N_V4_R805_1_A3_bach3_TGAGCGTGCT_R1.trim.contigs.good.unique.align:12981
PATH/V3_F357_N_V4_R805_1_A4_bach4_TGTGTGCATG_R1.trim.contigs.good.unique.align:12896
PATH/V3_F357_N_V4_R805_1_A5_bach5_TGTGCTCGCA_R1.trim.contigs.good.unique.align:11617

如果有像V3_F357_N_V4_R805_1_A1_bach1_GTATCGTCGT这样的键,你可以使用awk:

$ awk -F'[/.:]' '
    BEGINFILE{
      col[FILENAME]
    }
    { 
       row[$2]
       a[FILENAME,$2]=$NF
       next
    }
   END{
      for(i in row) { 
        printf "%s ",substr(i,1,length(i)-3)
        for(j in col) 
          printf "%s ",a[j SUBSEP i]; printf "\n" 
      }
  }' file1 file2 file3
V3_F357_N_V4_R805_1_A4_bach4_TGTGTGCATG 13424 12896 12896
V3_F357_N_V4_R805_1_A1_bach1_GTATCGTCGT 13175 12589 12589
V3_F357_N_V4_R805_1_A3_bach3_TGAGCGTGCT 13475 12981 12981
V3_F357_N_V4_R805_1_A2_bach2_GAGTGATCGT 14801 13934 13934
V3_F357_N_V4_R805_1_A5_bach5_TGTGCTCGCA 12053 11617 11617

这个awk脚本填充3个数组colrowa,分别存储列名(文件名),行内容和所有文件的值。

END语句通过循环遍历所有行和列来打印数组a的内容。

如果您需要餐桌装饰,请使用:

{ printf "Sample Nreads_ini Nreads_align Nreads_align \n"; awk -F'[/.:]' 'BEGINFILE{col[FILENAME]}{row[$2];a[FILENAME,$2]=$NF;next}END{for(i in row) { printf "%s ",substr(i,1,length(i)-3); for(j in col) printf "%s ",a[j SUBSEP i]; printf "\n" }}' file1 file2 file3; } | column -t  -s' ' -o ' | '

0
投票

你可以尝试一下,让我知道这是否对你有帮助。

awk --re-interval -F"[/.:]"  '
BEGIN{
  print "Sample                                   | Nreads_ini | Nreads_align  |"
}
FNR==NR{
  match($2,/.*[A-Z]{10}/);
  array[substr($2,RSTART,RLENGTH)]=$NF;
  next
}
match($2,/.*[A-Z]{10}/) && (substr($2,RSTART,RLENGTH) in array){
  print substr($2,RSTART,RLENGTH),array[substr($2,RSTART,RLENGTH)],$NF
}
' OFS=" | "  first_one  second_one | column -t

输出如下。

Sample                                   |  Nreads_ini  |  Nreads_align  |
V3_F357_N_V4_R805_1_A1_bach1_GTATCGTCGT  |  13175       |  12589
V3_F357_N_V4_R805_1_A2_bach2_GAGTGATCGT  |  14801       |  13934
V3_F357_N_V4_R805_1_A3_bach3_TGAGCGTGCT  |  13475       |  12981
V3_F357_N_V4_R805_1_A4_bach4_TGTGTGCATG  |  13424       |  12896
V3_F357_N_V4_R805_1_A5_bach5_TGTGCTCGCA  |  12053       |  11617
© www.soinside.com 2019 - 2024. All rights reserved.