shell 为什么这个bash循环无法连接文件?

xienkqul  于 2022-11-16  发布在  Shell
关注(0)|答案(3)|浏览(95)

我不知道为什么这个循环不能按照我需要的方式连接文件。基本上,假设我们有以下文件:

AB124661.lane3.R1.fastq.gz
AB124661.lane4.R1.fastq.gz

AB124661.lane3.R2.fastq.gz
AB124661.lane4.R2.fastq.gz

我们想要的是:

cat AB124661.lane3.R1.fastq.gz AB124661.lane4.R1.fastq.gz > AB124661.R1.fastq.gz
cat AB124661.lane3.R2.fastq.gz AB124661.lane4.R2.fastq.gz > AB124661.R2.fastq.gz

我尝试过(但没有成功):
1.创建文件名(AB 124661)并将其保存到ID文件:
第一个字符串|awk -F '.' '{打印$1}'|分类器|唯一性〉ID
这将创建一个存储样本/文件名的ID文件。
1.运行以下循环:

for i in `cat ./ID`; do cat $i\.lane3.R1.fastq.gz $i\.lane4.R1.fastq.gz \> out/$i\.R1.fastq.gz; done
    
for i in `cat ./ID`; do cat $i\.lane3.R2.fastq.gz $i\.lane4.R2.fastq.gz \> out/$i\.R2.fastq.gz; done

循环失败并连接到空文件中。
我尝试过的事情:

  • 是,ID文件肯定在文件夹中
  • 当我运行echo时,它显示cat命令正确

任何帮助都将不胜感激,
最好的,
交流

q3aa0525

q3aa05251#

1.为什么要转义\>?这将导致cat: '>': No such file or directory而不是重定向。

  1. Don't read lines with for
while IFS= read -r id; do
    cat "${id}.lane3.R1.fastq.gz" "${id}.lane4.R1.fastq.gz" > "out/${id}.R1.fastq.gz"
    cat "${id}.lane3.R2.fastq.gz" "${id}.lane4.R2.fastq.gz" > "out/${id}.R2.fastq.gz"
done < ./ID
8fq7wneg

8fq7wneg2#

假设您有id存储在文件中每行./ID

while read -r line; do
    cat "$line".lane3.R1.fastq.gz "$line".lane4.R1.fastq.gz > "$line".R1.fastq.gz
    cat "$line".lane3.R2.fastq.gz "$line".lane4.R2.fastq.gz > "$line".R2.fastq.gz
done < ./ID
vsmadaxz

vsmadaxz3#

纯壳解决方案可能如下所示:

for file in *.fastq.gz; do
    id=${file%%.*}
    [ -e "$id".R1.fastq.gz ] || cat "$id".*.R1.fastq.gz > "$id".R1.fastq.gz
    [ -e "$id".R2.fastq.gz ] || cat "$id".*.R2.fastq.gz > "$id".R2.fastq.gz
done

或者:

printf '%s\n' *.fastq.gz | cut -d. -f1 | sort -u |
while IFS= read -r id; do
    cat "$id".*.R1.fastq.gz > "$id".R1.fastq.gz
    cat "$id".*.R2.fastq.gz > "$id".R2.fastq.gz
done

此解决方案假定感兴趣的文件名不包含换行符。

相关问题