如何自动保存并附加注释到文件名?

时间:2017-10-17 07:29:16

标签: bash file loops

我从文件中提取数据,我想将这些工作(丑陋)命令行应用于给定文件夹中的所有txt文件。因此,我还需要在输出文件名后附加一个字符串,以避免在循环期间覆盖......欢迎任何建议。

for file in ./TEST/;
    do 
        awk '/R.Time/,/LC/' 070_WT3a.txt|awk '/R.Time/,/PDA/'|grep -v -E "PDA|LC"|grep -w -v "80,00000"|grep -w -v "80,00833"|grep -w -v "80,01667"|grep -w -v "80,01067"|grep -w -v "80,02133"|sed -n '1,9601p' > ./Output/Fluo.txt;
        awk '/R.Time/,/LC/' 070_WT3a.txt|awk '/R.Time/,/PDA/'|grep -v -E "PDA|LC"|grep -w -v "80,00000"|grep -w -v "80,00833"|grep -w -v "80,01667"|grep -w -v "80,01067"|grep -w -v "80,02133"|sed -n '9603,19203p' > ./Output/RID.txt;
    done

1 个答案:

答案 0 :(得分:0)

在循环内部,您可以使用变量${file}。第一个改进(可以在管道后添加额外的行):

for file in ./TEST/;
do 
   filebasename=${file##*/}
   awk '/R.Time/,/LC/' ${file}.txt |
      awk '/R.Time/,/PDA/' |
      grep -v -E "PDA|LC" |
      grep -w -v "80,00000"|
      grep -w -v "80,00833"|
      grep -w -v "80,01667"|
      grep -w -v "80,01067"|
      grep -w -v "80,02133"|
      sed -n '1,9601p' > ./Output/Fluo_${filebasename};
   awk '/R.Time/,/LC/' 070_WT3a.txt |
      awk '/R.Time/,/PDA/'|
      grep -v -E "PDA|LC"|
      grep -w -v "80,00000"|
      grep -w -v "80,00833"|
      grep -w -v "80,01667"|
      grep -w -v "80,01067"|
      grep -w -v "80,02133"|
      sed -n '9603,19203p' > ./Output/RID_${filebasename};
done

接下来你可以做的就是改进解析 如果没有示例输入/输出,很难看到/测试解决方案,我无法确定是否需要在9601/9603/19203行分割所有文件,这似乎适用于070_WT3a.txt。 我想从跳过80*行开始,但这些行可能在里面有R.Time / LC的边界,所以这无济于事。 您可能希望使用

070_WT3a.txt上进行测试
awk '/R.Time/,/LC/' 070_WT3a.txt |awk '/R.Time/,/PDA/'|
   grep -v -E "PDA|LC"|grep -Ewv "80,0(0000|0833|1667|1067|2133)"

你可以尝试将2 awk组合成一个(或者甚至在grep内获得awk,但这会变得非常复杂,如果没有明确的话就难以测试要求和例子。

编辑: 在使用示例输入进行测试后,我发现了这个简化:

for file in TEST/*.txt; do 
   filebasename=${file##*/}
   awk '/LC Chromatogram(Detector A-Ch1)/,/^80,/' "${file}" | 
      grep -E "^[0-7]" > Output/Fluo_${filebasename}
   awk '/LC Chromatogram(Detector B-Ch1)/,/^80,/' "${file}" |
      grep -E "^[0-7]" > Output/RID_${filebasename}
done

在循环内部我使用$ {file},每个循环都有不同的文件名。 filenaam也用于输出文件的名称。文件名将以TEST/开头,可以使用${file##*/}进行删除(有很多不同的方法,例如使用cut -d"/"sed 's/..,这个方法很快。)