【问题标题】:Concatenate pairs of files in a loop bash在循环bash中连接文件对
【发布时间】:2021-07-30 01:47:58
【问题描述】:

我有一个表,每个文件都有要连接的文件

a.filtred.bed.gff   a.genomic.gff
b.filtred.bed.gff   b.genomic.gff

所以,我想在 bash 循环中与 for 连接

cat a.filtred.bed.gff a.genomic.gff > a.combine.gff

但我不知道该怎么做,可能有两个变量或匹配对,但这对我来说不是一个简单的逻辑

【问题讨论】:

  • 我忘了说,这不是一个列表。它是一个表,a 需要匹配 a.filtred.bed.gff 需要匹配 a.genomic.gff。但是 a 它不是同一个字符串
  • 你说的table是什么意思?包含您发布的内容的文本文件,即每行 2 个文件,由空格分隔?文件名中包含空格的文件名如何表示?
  • 以制表符分隔
  • 要成为一个可接受的问题,您 (1) 需要将 this 信息放入您的问题中,而不是放入评论中,并且 (2) 显示您所做的尝试解决问题。不要忘记 SO 旨在讨论编程问题,而不是要求其他人简单地为您完成工作。

标签: bash loops concatenation data-science data-manipulation


【解决方案1】:

尝试查找。

您没有提供该表,因此我们无法帮助您加载它,但如果您创建一个关联数组,您可以将其中的文件作为键/值对进行匹配。

$: declare -A lookup;
$: cat file
a.filtred.bed.gff   a.genomic.gff
b.filtred.bed.gff   b.genomic.gff
$: while read k v; do lookup["$k"]="$v"; done < file
$: for k in "${!lookup[@]}"; do echo "cat $k ${lookup[$k]} > ${k}_${lookup[$k]}.merge"; done
cat b.filtred.bed.gff b.genomic.gff > b.filtred.bed.gff_b.genomic.gff.merge
cat a.filtred.bed.gff a.genomic.gff > a.filtred.bed.gff_a.genomic.gff.merge

或者也许只是添加第三列并直接从表格中执行。

$: cat file
a.filtred.bed.gff a.genomic.gff myA.merge
b.filtred.bed.gff b.genomic.gff myB.merge
$: while read -r a b c; do echo "cat $a $b > $c"; done < file
cat a.filtred.bed.gff a.genomic.gff > myA.merge
cat b.filtred.bed.gff b.genomic.gff > myB.merge

【讨论】:

    【解决方案2】:

    因为后缀似乎是不变的:

    for gen in *.genomic.gff; do
        prefix=${gen%.genomic.gff}
        cat "${prefix}.filtred.bed.gff" "$gen" > "${prefix}.combine.gff"
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 2013-02-13
      • 2020-04-21
      • 2014-10-30
      • 2014-09-16
      • 2010-12-04
      相关资源
      最近更新 更多