循环多个文件进行过滤
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
我有一个文件列表(总共 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