Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用正则表达式指定输出文件名_Regex_Shell_Sh - Fatal编程技术网

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