根据字段数连接列

Joining columns based on number of fields

我有一个大型工作流程,它被未表征的染色体绊倒了 - 一个过程产生一个计数矩阵,该矩阵具有 n 字段用于规范染色体,对于具有未表征染色体的品系,字段是 n + 1n + 2。这让下游使用read.table()很头疼

我的方法是首先识别什么是n,然后用它来隔离n + 1 n + 2 行包含这些未表征的染色体:

awk -v nf="$canon" 'NF!=nf{print}{}' matrix.txt | head
chr22   KI270733v1  random  123189  123362  +   6   4   8   0   0   10
chrUn   GL000220v1  105951  106963  -   0   0   0   0   10  0 

这些行的目标是通过连接第一列和第二列来匹配字段数 n,其中 n + 1 和第一、第二和第三列 n + 2 产生:

chrUn-GL000220v1    105951  106963  -   0   0   0   0   10  0
chr22-KI270733v1-random 123189  123362  +   6   4   8   0   0   10

尝试

我可以对矩阵进行子集化并将其分成 3 个文件,一个用于 NF==n,NF==n+1 & NF==n+2 并加入列:

awk -v n="$canon" 'NF==n{print}{}' matrix.txt | head

chr1    15534236    15536814    -   0   10  0   0   0   3

(^ 无需操作)

awk -v n="$canon" 'NF==n+1{print}{}' matrix.txt | awk -v OFS="\t" '{print "-",,,,,,,,}' | head

chrUn-GL000220v1    105992  107309  -   0   0   0   0   0   4

awk -v n="$canon" 'NF==n+2{print}{}' matrix.txt | awk -v OFS="\t" '{print "-""-",,,,,,,,,}' | head

chr22-KI270733v1-random 123189  123362  +   6   4   8   0   0   10

不幸的是,这个解决方案不是动态的——我必须指定列的范围。工作流可以在前四列详细说明 Chr、Start、Stop、Strand 之后包含任意数量的列。


希望我已经很好地定义了问题,任何建议将不胜感激。

尝试:

awk -v n=13 '{ for (i = 2; i <= NF - n + 1; ++i) {  = "-"$i; $i=""; } } 1'

积累成</code>,清理<code>$i=""剩下的

您也可以将值向左移动 if (NF != n) for (i = 2; i < NF; ++i) $i=$(i+(NF-n)) 个值并设置 NF=n.