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

时间:2017-12-24 05:15:52

标签: regex shell sh

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

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中调用它)

2 个答案:

答案 0 :(得分: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。 / p>

希望它有所帮助,问候。

答案 1 :(得分: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 ...