我是 Bash 命令行使用新手,需要了解在现有单引号内执行单引号的正确语法。
ls *file.fa | parallel -j4 'perl -pe 's/^>/>{}/' {} >newfile_{}'
我知道 GNU 并行命令并不是特别出名或使用,但我认为对于需要单引号内的单引号的不同命令,语法不会有所不同。该命令是将名为 file.fa 的文件中的 > 更改为 >file.fa(> 然后是文件名),其中 {} 包含从 ls *file.fa 部分通过管道传输的文件。
非常感谢任何帮助
GNU Parallel 中的引用是一门黑术。手册中有一整节专门用于引用。
在这种情况下我会写一个函数:结论:为了避免处理引用问题,编写一个小脚本或一个函数(记住导出 -f 函数)并让 GNU parallel 调用它可能会更容易。
fasta_namer() {
NAME=$1
perl -pe "s/^>/>$NAME/" "$NAME" >newfile_"$NAME"
}
export -t fasta_namer
ls *file.fa | parallel -j4 fasta_namer {}
FASTA 文件名通常并不奇怪,但如果它们很奇怪(例如包含 ' " \ * & / 或其他疯狂的字符),那么这可能会解决它:
fasta_namer() {
NAME=$1
PERLQUOTED=$2
NEWNAME=$3
perl -pe "s/^>/>$PERLQUOTED/" "$NAME" >"$NEWNAME"
}
export -t fasta_namer
ls *file.fa | parallel -j4 fasta_namer {} '{=$_=quotemeta($_)=}' {.}.new.fa