我从文件中提取数据,我想将这些工作(丑陋)命令行应用于给定文件夹中的所有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
答案 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/..
,这个方法很快。)