Bash 使用特定命名方案连接成对文件(UBUNTU)

Bash 使用特定命名方案连接成对文件(UBUNTU),bash,concatenation,ubuntu-14.04,Bash,Concatenation,Ubuntu 14.04,**这里似乎有一个部分答案,但用户遇到了与我相同的问题:保留原始命名方案很重要 ** 我有一个文件夹,里面有成对的文件;名称如下所示(均存储在同一文件夹/目录中): MX_HF20.1.fq.gz; MX_HF20.rem.1.fq.gz MX_HF22.1.fq.gz; MX_HF22.rem.1.fq.gz SD_F296.1.fq.gz; SD_F296.rem.1.fq.gz SD_F297.1.fq.gz; SD_F297.rem.1.fq.gz (有些人可能会将其识别为堆栈输出

**这里似乎有一个部分答案,但用户遇到了与我相同的问题:保留原始命名方案很重要

**

我有一个文件夹,里面有成对的文件;名称如下所示(均存储在同一文件夹/目录中):

MX_HF20.1.fq.gz; MX_HF20.rem.1.fq.gz

MX_HF22.1.fq.gz; MX_HF22.rem.1.fq.gz

SD_F296.1.fq.gz; SD_F296.rem.1.fq.gz

SD_F297.1.fq.gz; SD_F297.rem.1.fq.gz

(有些人可能会将其识别为堆栈输出!)

实际上,我只是想将*.1.rem.fq.gz文件的内容附加到*.1.fq.gz文件的末尾,保留原始*.1.fq.gz文件的名称

我一直在玩弄测试文件,所以我知道cat会这么做,即使这些文件是.gz。但我的bash脚本编写能力充其量也很差,使用和存储名称变量是一个我仍在努力掌握的概念


非常感谢

可以尝试使用bash重新匹配:

#!/bin/bash

p='([A-Z]+_[A-Z]+)([0-9]+)\.1\.rem\.fq\.gz'

for f in *.gz; do
    if [[ $f =~ $p ]]; then
        cat "${f}" >> "${BASH_REMATCH[1]}${BASH_REMATCH[2]}.1.fq.gz"
    fi
done
例如:


SD_F297.1.rem.fq.gz
将被附加到
SD_F297.1.fq.gz

听起来您正在寻找这样的东西:

#!/bin/bash
for file1 in *.1.fq.gz;  do
   file2=`echo $file1 | sed -E 's/(*\.1)\.fq\.gz/\1.rem.fq.gz/'`
   cat $file1 $file2 > out.$file1
done
反引号执行shell命令并将文本结果插入脚本中的该点

sed是unix中处理文本行的流编辑器


它使用正则表达式,在本例中,您需要()对文件名的第一部分进行分组和捕获,\1引用它

谢谢您的回复!我尝试了这个方法,脚本运行时没有错误,但它似乎根本没有改变任何一个文件(我制作了更小、更简单的文本文件(gzip),与上面的文件同名)。我确实尝试将*.txt术语更改为*.fq.gz,结果是一样的。有没有什么我错过了?也许脚本找不到任何可以操作的东西。@canfiese:它应该可以工作,我很惊讶它没有。也许试着把“回声”放在“猫”前面看看会发生什么。回声不会改变文件,但会告诉你可能发生的事情。对不起,我是个白痴。上面的命名方案不正确。它应该是*.rem.1.fq.gz。我把它调换了一下,它确实做了些什么……但它使我的测试文件变为175MB(从16字节开始),它无法打开。这很奇怪,但我以前见过。这一定是.gz的一个特点…我让它工作了。我不小心把东西调换了,我想这会导致奇怪的行为。非常感谢。用.1切换.rem是一种魅力。对不起,我头疼,不客气!不用担心,它发生了,很高兴它起作用。(编辑)@zakum1谢谢!这看起来真的在正确的轨道上(从我很少的经验来看)。但是我确实得到了以下错误:sed:-e expression#1,char 30:前面的正则表达式无效因此,这可能会有所不同…但是我必须编辑我的文件名系统。满脸都是*.rem.1.fq.gz鸡蛋。对不起/