根据字段数连接列
Joining columns based on number of fields
我有一个大型工作流程,它被未表征的染色体绊倒了 - 一个过程产生一个计数矩阵,该矩阵具有 n 字段用于规范染色体,对于具有未表征染色体的品系,字段是 n + 1 和 n + 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
.
我有一个大型工作流程,它被未表征的染色体绊倒了 - 一个过程产生一个计数矩阵,该矩阵具有 n 字段用于规范染色体,对于具有未表征染色体的品系,字段是 n + 1 和 n + 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
.