使用多个文件中的数据创建 tsv 文件

使用多个文件中的数据创建 tsv 文件

如何从多个文件创建 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 位于同一行?

谢谢。

相关内容