【问题标题】:Parse text files from multiple folders and create new ones [shell]解析来自多个文件夹的文本文件并创建新的 [shell]
【发布时间】:2021-02-12 15:46:46
【问题描述】:

我有这个文件夹结构...

171219_NB501241_0070_AHCHYNBGX5
├── fastq
│   ├── Reports
│   ├── Stats
│   ├── Undetermined_S0_R1_001.fastq.gz
│   └── Undetermined_S0_R2_001.fastq.gz
├── Logs
│   └── Logs.zip
├── Recipe
│   └── NS2932577-REAGT.xml
├── RTAComplete.txt
├── RTAConfiguration.xml
└── samplesheet.R70.csv
180201_NB501241_0088_AHJ2GHBGX5
├── fastq
│   ├── Reports
│   ├── Stats
│   ├── Undetermined_S0_R1_001.fastq.gz
│   └── Undetermined_S0_R2_001.fastq.gz
├── Logs
│   └── Logs.zip
├── Recipe
│   └── NS2951235-REAGT.xml
├── RTAComplete.txt
├── RTAConfiguration.xml
└── samplesheet.R88.csv

...Stats 中有一个文本文件,我想从中读取一些特定的行并在每个 fastq 文件夹 (17121.../fastq/) 中生成一个新的文本文件。

运行这些代码行...

for i in 70 88
>do cat *0${i}*/fastq/Stats/DemultiplexingStats.xml | grep -e "<Sample name" -e "<BarcodeCount" >> *0${i}*/fastq/rawcounts2
>done

...我遇到了这个错误,我不知道我错过了什么(如果文本重定向在循环结束时效果很好,但我想要每个文件夹都有一个特定的文件):

-bash: *070*/fastq/rawcounts2: No such file or directory
-bash: *088*/fastq/rawcounts2: No such file or directory

谢谢。

【问题讨论】:

  • 使用 find 和 -exec 而不是 for

标签: bash shell loops


【解决方案1】:

假设:

  • 可能有多个文件和/或目录匹配模式*0${i}*
  • 匹配的目录可能不包含源文件 (DemultiplexingStats.xml)
  • OP 已确认grep 命令返回所需的结果(否则 OP 可能需要提供源文件和匹配目标文件的样本)

修改OP的当前代码:

for d in *070* *088*
do
    [ ! -d "${d}" ] && continue

    srcfile="${d}"/fastq/Stats/DemultiplexingStats.xml
    tgtfile="${d}"/fastq/rawcounts2

    [ ! -f "${srcfile}" ] && echo "WARNING: cannot find file '${srcfile}'. Skipping." && continue

    grep -e "<Sample name" -e "<BarcodeCount" "${srcfile}" >> "${tgtfile}"
done

【讨论】:

  • 是的,它正在工作。我想说唯一的问题是我如何调用文件夹......我对shell有点天真,调用没有 * 的文件夹并稍后添加它们有什么区别(因为我做到了)还是一开始就使用 * ? (如果我将循环更改为for i in *folder*... 格式,它可以很好地工作,但如果只有for i in folder... 则不行)。谢谢,markp-fuso。
【解决方案2】:

尝试以下方法:

find . -path "*/fastq/Stats/DemultiplexingStats.xml" -execdir grep -e "<Sample name" -e "<BarcodeCount" '{}' >> ../rawcounts2 \;

查找所有以“/fastq/Stats/DemultiplexingStats.xml”结尾的文件,然后在找到的文件目录中,对找到的文件执行 grep 命令,并输出到上一级目录中的 rawcounts2 文件当前的。

【讨论】:

  • 感谢您的回复,拉曼。这很好用,但我忘了澄清我想要一个 rawcounts2 不是在以前的级别,而是在每个 fastq 文件夹内有一个 特定和个人 (每个 1712.../fastq/ 会有一个)。谢谢。
猜你喜欢
  • 2015-11-15
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
  • 1970-01-01
  • 2013-12-29
  • 2021-11-24
  • 2013-01-09
  • 2020-04-26
相关资源
最近更新 更多