【问题标题】:How to save automatically with append comment to file name?如何使用附加注释自动保存到文件名?
【发布时间】:2017-10-17 07:29:16
【问题描述】:

我正在从文件中提取数据,我想将这些工作(丑陋的)命令行应用于给定文件夹中的所有 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

【问题讨论】:

  • 您能否提供一些示例数据和可能的输出?
  • 使用 -e 选项可以避免多个grep -w -v 命令。
  • 这里有一个简化的输入和两个输出文件... [链接] (wetransfer.com/downloads/…)

标签: bash file loops


【解决方案1】:

在循环内部,您可以使用变量${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/..,这个很快)。

【讨论】:

  • 这里有一个简化的输入和两个输出文件... [链接] (wetransfer.com/downloads/…)
  • 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)"
  • 试试awk '/LC Chromatogram(Detector A-Ch1)/,/^80,/' 070_WT3a.txt | grep -E "^[0-7]"awk '/LC Chromatogram(Detector B-Ch1)/,/^80,/' 070_WT3a.txt | grep -E "^[0-7]" 之类的,但这些都不是原来的问题。
  • 最新的评论工作正常,但循环只是给出这样的错误: bash: ./Output/Fluo_./Test/.txt: No such file or directory awk: fatal: cannot open file @ 987654337@./Test/.txt' 供读取(没有这样的文件或目录)???
  • 经过几次额外的尝试,循环成功了!!!沃尔特 A,你让我很开心,非常感谢
猜你喜欢
  • 2012-08-19
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
相关资源
最近更新 更多