我有一个文件列表(总共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/* _residet .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 || $7 == "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 || $7 == "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 || $7 == "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 || $7 == "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 || $7 == "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
命令作为示例) - 所有输出都被写入"当前"目录(否则可以修改示例代码以写入正确的目录)
一个想法是使用参数替换从文件名中提取所需的字符串,然后使用它运行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 || $7 == "ADD"{print}' "${fname}" > "${tox}_resid_ADD"
done < <(find FILEPATH -name "*.glm.linear" -type f)
在我的环境中,我用dir3/sdir2
替换了FILEPATH
(4x*.glm.linear
文件的位置),这段代码执行了以下命令:
awk NR==1 || $7 == "ADD"{print} dir3/sdir2/Late_Tox_GWAS.AtrophyG1_resid.glm.linear > AtrophyG1_resid_ADD
awk NR==1 || $7 == "ADD"{print} dir3/sdir2/Late_Tox_GWAS.AtrophyG2_resid.glm.linear > AtrophyG2_resid_ADD
awk NR==1 || $7 == "ADD"{print} dir3/sdir2/Late_Tox_GWAS.IndurationG1_resid.glm.linear > IndurationG1_resid_ADD
awk NR==1 || $7 == "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