如何从多个文件创建 tsv 文件?
我希望能够从几个不同的文件创建一个 tsv 文件。一个样本与五个包含数据的“区域”文件相关联。例如,sample1 的文件为:1_region1.cov、1_region2.cov、1_region3.cov、1_region4.cov 1_region5.cov,其中 1_regionX.cov 是一个 tsv标头。我对“meandepth”标题下的数据感兴趣。我想获取值 1_region1,然后将其添加到我自己的 tsv 文件中的 Region1 标题下。有 13 个样本,每个样本都有 5 个区域文件,因此总共有 65 个 .cov 文件。
我的输出的一个例子是:
样本 | 区域1 | 区域2 | 区域3 | 区域4 | 区域5 |
---|---|---|---|---|---|
1 | 45 | 32 | 33 | 28 | 15 |
2 | 30 | 25 | 22 | 60 | 105 |
3 | 44 | 50 | 22 | 55 | 77 |
... | ... | ... | ... | ... | |
13 | 2 | 3 | 50 | 45 | 66 |
在这个例子中,数字只是编造的。
这是我目前的尝试:
## Sample array
samples=()
for i in {1..13};do samples+=($i); done
## Regions array
regions=(region1 region2 region3 region4 region5)
## I make some variables to store data
arr=()
CountData=()
CountIndex=0
SampleIndex=0
x=''
delim=':'
## I loop through my samples array to collect CountData from the .cov files. I know the naming convention of these files and follow it.
for ((i=0; i<${#samples[@]}; i++)); do
for j in ${regions[@]};do CountData+=($(awk '{ for(k=1;k<=NF;k++){if($k == "meandepth"){getline; print $k} } }' ${samples[$i]}_${j}.cov)); done
done
## I loop through my CountData array to collect the tuples and store them into an array
for n in $(seq 0 $((${#CountData[@]} - 1))); do
count=$((CountIndex + 1))
samplename=${samples[$SampleIndex]}
if [ $((count % 6)) -eq 0 ];then
arr+=($samplename$x) && CountIndex=$((CountIndex + 1)) && x='' && \
SampleIndex=$((SampleIndex + 1))
else
x=$x$delim${CountData[$CountIndex]}
CountIndex=$((CountIndex + 1))
fi
done
# I loop through my array and output the tuples as a tsv
for i in ${arr[@]}; do echo $i | sed 's/:/\t/g' >> output.tsv; done
# I add the header in after
sed -i "1iSample\tRegion1\tRegion2\tRegion3\tRegion4\tRegion5
我的尝试使用两个索引来循环数组。这是我尝试获取与同一行中的样本 1 关联的所有文件,但在第一个样本之后,数字不再与文件中的内容匹配,即; Sample2 Region1 将报告 15 而不是 30。实际上,此脚本也只能循环遍历前 11 个样本。这可能是因为我在条件中使用了模六。
如何从多个文件创建 tsv 文件,以便与 Sample1 关联的五个文件中的每一个最终都与 Sample1 位于同一行?
谢谢。