使用正则表达式指定输出文件名

问题描述 投票:0回答:2

我有一个包含许多文件的文件夹,我只需要一些列,所以我试着提取我需要的东西:

mkdir ./raw_data/selection

doit() {
    csvfix read_dsv -f 1,3,7 -s \; $1 > $1 | sed 's/raw_data/raw_data\/selection/'
}
export -f doit
Files_To_Parse=`ls ./raw_data/*csv`
parallel doit ::: $Files_To_Parse

这不起作用。

但如果我这样:

cd ./raw_data
doit() {
    csvfix read_dsv -f 1,3,7 -s \; $1 > selection/$1
}
export -f doit
Files_To_Parse=`ls -1 *csv`
parallel doit ::: $Files_To_Parse

它工作但我希望能够从这个项目的顶层文件夹运行它(即将它放在一个名为brief_csv.sh的文件中,并从IDE调用它)

regex shell sh
2个回答
1
投票

如果你使用Bash,你可以:

for f in raw_data/*.csv
do 
    csvfix ... "$f" > raw_data/selection/"${f##*/}"
done

此外,你可以使用csvfix代替cut提取列:

$ cut -d \; -f 1,3,7 $f ...

1
投票

我不知道您正在使用的命令,但是这一行:

csvfix read_dsv -f 1,3,7 -s \; 1美元> 1美元sed ...

将输出重定向到您正在阅读的同一文件中;这不行。事实上,你说你的修改后的代码是有效的。您可以使用临时文件来存储中间结果,不要害怕使用其中的许多:调试将更容易(您可以看到中间段)并且系统不会受到影响。 / tmp是放置这些中间文件的好地方。

使用csvfix执行第一步,并在/ tmp / my-csvfix-intermediate中重定向;然后使用sed读取/ tmp / my-csvfix-intermediate,并写入/ tmp / my-grep-intermediate。在最后一次传递之后,您可以获取最后的中间结果并覆盖原始文件,可能是在备份之后。您可以在任何需要的地方移动文件,我没有看到从IDE运行脚本时出现任何问题 - 只需根据需要使用尽可能多的段落。

调试时避免并行化,当脚本工作时,可以添加并行化。

当两个或多个并行进程尝试在同一个文件(/tmp/my-...-intermediate)中写入时,您将遇到另外一个问题。要解决此问题,您需要为每个进程使用不同的文件。 bash变量“$$”来帮助,只需使用“/ tmp / my - $$ - blablabla”之类的文件名,$$将被进程的PID替换,并行进程不能具有相同的PID 。

希望它有所帮助,问候。

© www.soinside.com 2019 - 2024. All rights reserved.