shell脚本中转​​义括号和其他字符

shell脚本中转​​义括号和其他字符

我已经在命令行上运行了以下命令,它工作正常,但是当我尝试从 shell 脚本运行它并从终端运行 shell 脚本时,出现以下错误:

join -t $'\t' -a1 -e "u" -1 1 -2 1 -o 1.1,2.1,2.2 file1 \ <(cat file2 | sort -k1,1|tr [:blank:] \\t ) | awk 'BEGIN {FS="\t";OFS="\t"}{if \($2 == "u")print $0, $1;else print $0, $3}' | awk '{gsub(/ /,"\t");l=$4; sub(/.*_/,"",l); print $2"\t"$3"\t"l}' > out

syntax error near unexpected token('`

我已经尝试转义括号,但它仍然给我同样的错误。我的脚本中有很多这样的多层命令,所以我确信这在其他部分会出现问题,有办法解决这个问题吗?

答案1

你失去的是)你的尾随标准输入子条款。我怀疑您在尝试阅读代码时感到头疼。

尝试这样做,这有助于进一步优化,因为它(更)可读:

tr '[:blank:]' $'\t' <file2 |
    awk '
        BEGIN { FS="\t"; OFS="\t" }
        { if ($2 == "u") print $0, $1; else print $0, $3 }
    ' |
    awk '
        { gsub(/ /,"\t"); l=$4; sub(/.*_/,"",l); print $2 "\t" $3 "\t" l }
    ' |
    sort |
    join -t $'\t' -a1 -e "u" -1 1 -2 1 -o 1.1,2.1,2.2 file1 - >out

相关内容