循环多个文件进行过滤

Loop over a number of files to carry out filtering

我有一个文件列表(总共 15 个),文件名不同,格式相同,除了以粗体突出显示的第 4 个世界。

Late_Tox_GWAS.**TelangiectasiaG1**_resid.glm.linear
Late_Tox_GWAS.**AtrophyG1**_resid.glm.linear
Late_Tox_GWAS.**AtrophyG2**_resid.glm.linear
Late_Tox_GWAS.**IndurationG1**_resid.glm.linear

等...

所有这些文件都位于 /scrat/genome/hj86/Late_Tox_GWAS/*_resid.glm.linear

所有这些文件都具有相同的列数和相同的列名。我想过滤第 7 列中的所有这些文件以获得 'ADD'。我有 运行 这个示例命令来过滤第 7 列,这样每个文件都会发生这种情况,然后应该保存到单独的相应文件中,例如下一个是 AtrophyG1_resid_ADD 下一个是 AtrophyG2_resid_ADD 等等...

我是循环的新手,不知道如何编码以便读入每个单独的毒性,也不知道如何指定文件名的唯一位以便处理每个文件和结果保存到相应的唯一文件名。如有任何帮助,我将不胜感激。

#!/bin/bash
#PBS -N Late_Tox_regression_ADD
#PBS -l walltime=01:00:00
#PBS -l nodes=1:ppn=8
#PBS -l vmem=16gb
#PBS -m bea
#PBS -M my email address
set -x


for fname in /scrat/genome/hj86/Late_Tox_GWAS/*_resid.glm.linear

do
    tox="${fname#*.}"                      
    tox="${tox%%_*}"                         

    awk 'NR==1 ||  == "ADD"{print}' "${fname}" > "${tox}_resid_ADD"

done


我没有得到任何输出,只有一个文件说:

+ for fname in '/scratch/genomeqol/hkj7/Late_Tox_GWAS/*_resid.glm.linear'
+ tox=AtrophyG1_resid.glm.linear
+ tox=AtrophyG1
+ awk 'NR==1 ||  == "ADD"{print}' /scratch/genomeqol/hkj7/Late_Tox_GWAS/Late_Tox_GWAS.AtrophyG1_resid.glm.linear
+ for fname in '/scratch/genomeqol/hkj7/Late_Tox_GWAS/*_resid.glm.linear'
+ tox=AtrophyG2_resid.glm.linear
+ tox=AtrophyG2
+ awk 'NR==1 ||  == "ADD"{print}' /scratch/genomeqol/hkj7/Late_Tox_GWAS/Late_Tox_GWAS.AtrophyG2_resid.glm.linear
+ for fname in '/scratch/genomeqol/hkj7/Late_Tox_GWAS/*_resid.glm.linear'
+ tox=IndurationG1_resid.glm.linear
+ tox=IndurationG1
+ awk 'NR==1 ||  == "ADD"{print}' /scratch/genomeqol/hkj7/Late_Tox_GWAS/Late_Tox_GWAS.IndurationG1_resid.glm.linear
+ for fname in '/scratch/genomeqol/hkj7/Late_Tox_GWAS/*_resid.glm.linear'
+ tox=Induration_G2_resid.glm.linear
+ tox=Induration
+ awk 'NR==1 ||  == "ADD"{print}' /scratch/genomeqol/hkj7/Late_Tox_GWAS/Late_Tox_GWAS.Induration_G2_resid.glm.linear

对于文件的位置和我们正在处理的文件数量有点困惑:

  • FILEPATH/${tox}/*.glm.linear* 似乎表明每个 ${tox} 都有一个单独的子目录,但在所述子目录中可能有多个文件
  • for entry in FILEPATH/${tox}/*.glm.linear* 似乎暗示在这个目录中可能有多个文件要处理 (FILEPATH/${tox}),但是 entry 从未在代码中的其他任何地方被引用,所以......
  • 我们最终可能会多次处理名为 Late_Tox_GWAS.{tox}_resid.glm.linear 的文件(即,每个 entry=*.glm.linear* 文件处理一次)

假设:

  • OP 知道如何定位要处理的文件列表(对于示例代码,我将使用 find 命令作为示例)
  • 所有输出都写入到'current'目录(否则可以修改示例代码写入正确的目录)

一个想法是使用参数替换从文件名中提取所需的字符串,然后将其用于 运行 OP 的 awk 脚本:

while read -r fname
do
    tox="${fname#*.}"                        # strip off all characters from the front of the string up to and including the first "."
    tox="${tox%%_*}"                         # strip off all characters from the first "_" to the end of the string

    awk 'NR==1 ||  == "ADD"{print}' "${fname}" > "${tox}_resid_ADD"

done < <(find FILEPATH -name "*.glm.linear" -type f)

在我用 dir3/sdir2 替换 FILEPATH 的环境中(4x *.glm.linear 文件的位置)此代码执行了以下命令:

awk NR==1 ||  == "ADD"{print} dir3/sdir2/Late_Tox_GWAS.AtrophyG1_resid.glm.linear > AtrophyG1_resid_ADD
awk NR==1 ||  == "ADD"{print} dir3/sdir2/Late_Tox_GWAS.AtrophyG2_resid.glm.linear > AtrophyG2_resid_ADD
awk NR==1 ||  == "ADD"{print} dir3/sdir2/Late_Tox_GWAS.IndurationG1_resid.glm.linear > IndurationG1_resid_ADD
awk NR==1 ||  == "ADD"{print} dir3/sdir2/Late_Tox_GWAS.TelangiectasiaG1_resid.glm.linear > TelangiectasiaG1_resid_AD

导致在我的当前目录中创建以下文件:

$ ls -1 *resid*ADD
AtrophyG1_resid_ADD
AtrophyG2_resid_ADD
IndurationG1_resid_ADD
TelangiectasiaG1_resid_ADD