Regex 使用正则表达式指定输出文件名
我有一个包含许多文件的文件夹,其中我只需要一些列,因此我尝试了以下方法来提取我需要的内容:Regex 使用正则表达式指定输出文件名,regex,shell,sh,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_
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
的文件中并从IDEs调用)我不知道您正在使用的命令,但这一行:
csvfix读取dsv-f 1,3,7-s\$1>每平方米1美元
重定向正在读取的同一文件中的输出;这是行不通的。事实上,您说修改后的代码可以工作。您可以使用临时文件来存储中间结果,不要害怕使用许多临时文件:调试将更容易(您可以看到中间段落),并且系统不会受到影响/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
希望对您有所帮助,尊敬的。我不知道您使用的命令,但这行: csvfix读取dsv-f 1,3,7-s\$1>每平方米1美元 重定向正在读取的同一文件中的输出;这是行不通的。事实上,您说修改后的代码可以工作。您可以使用临时文件来存储中间结果,不要害怕使用许多临时文件:调试将更容易(您可以看到中间段落),并且系统不会受到影响/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
希望对您有所帮助,问候。如果您使用Bash,您可以:
for f in raw_data/*.csv
do
csvfix ... "$f" > raw_data/selection/"${f##*/}"
done
此外,您可以使用cut
,而不是csvfix
来提取列:
$ cut -d \; -f 1,3,7 $f ...
如果使用Bash,则可以:
for f in raw_data/*.csv
do
csvfix ... "$f" > raw_data/selection/"${f##*/}"
done
此外,您可以使用cut
,而不是csvfix
来提取列:
$ cut -d \; -f 1,3,7 $f ...
第一次尝试时,ls命令中没有“-1”选项,这是一个输入错误吗?我认为这是必要的。对于您的主要问题,如果这是Bash,您是否尝试过“$1>/raw\u data/selection/${1:9}”?否则,可能“$1>$(echo$1 | sed's/raw_data/raw_data\/selection/”?
ls
知道它何时写入管道,并自动启用-1
行为。只有当您想查看交互式会话中的输出时,才真正需要此选项。无论如何,不要在scrips中使用ls
。正确的方法是简单地parallel doit::*csv
这是一个打字错误,您在第一次尝试时在ls命令中没有“-1”选项吗?我认为这是必要的。对于您的主要问题,如果这是Bash,您是否尝试过“$1>/raw\u data/selection/${1:9}”?否则,可能“$1>$(echo$1 | sed's/raw_data/raw_data\/selection/”?ls
知道它何时写入管道,并自动启用-1
行为。只有当您想查看交互式会话中的输出时,才需要此选项。无论如何,不要在scrips中使用ls
。正确的方法是简单地parallel doit::*csv