循环多个文件进行过滤

  • 本文关键字:过滤 文件 循环 loops awk
  • 更新时间 :
  • 英文 :


我有一个文件列表(总共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

相关内容

  • 没有找到相关文章

最新更新