如何在 bash shell 中使用 awk $1 $2 ?

如何在 bash shell 中使用 awk $1 $2 ?
cat << EOF > test.sh

cat $FILEA $FILEB | sort -k1,1 -k2,2n | mergeBed -i - | awk -F\\t '{print $1 "\t" NR "\t\t" $2 "\t" $3 "\t\t.\t\t" NR}' > unionpeaks.gff

EOF

我发现 $1 $2 $3 无法在输出文件中传递给 awk。我有:

cat /file1.narrowPeak /file2.narrowPeak | sort -k1,1 -k2,2n | mergeBed -i - | awk -F\t '{print  "\t" NR "\t\t"  "\t"  "\t\t.\t\t" NR}' > merge.gff

答案1

此处文档中的 $1、$2 和 $3 按原样替换cat。此时参数没有任何意义,因此被替换为空字符串。考虑:

bash-4.4$ cat << EOF > test2.sh
> >$1<>$2<>$3<
> EOF
bash-4.4$ cat test2.sh 
><><><

答案2

首先,很容易简单地指出该方法有点多余。但一次只做一件事...

当使用 时cat <<EOF,其中任何可以被解析为内联命令或替换的内容都将被解析为内联命令。这意味着像$1和 这样的东西$(...)将在创建定界文档之前首先被评估。如果您希望避免这种情况,最简单的选择是单引号EOF

cat <<'EOF'
heredoc string stuff in here
EOF

但我不确定这就是你想要的。对于您希望出现在文件中的任何内容,只需将其通过管道传送到那里即可:

cat $FILEA $FILEB | sort -k1,1 -k2,2n | mergeBed -i - | awk -F\\t '{print $1 "\t" NR "\t\t" $2 "\t" $3 "\t\t.\t\t" NR}' > unionpeaks.gff

Heredoc 不是必需的。现在,让我们看看命令本身:

sort -k1,1 -k2,2n -- "$FILEA" "FILEB" | mergeBed -i - | awk -v FS="\t" -v OFS="\t" '{ print $1, NR, "", $2, $3, "", ".", "", NR }' > unionpeaks.gff

cat根本没有必要。sort可以将文件名作为输入,因此不需要额外的调用——我只是添加了 a--以确保它不会破坏以-(破折号)开头的文件。另外,您似乎想要制表符分隔,因此将OFS(输出字段分隔符)设置为制表符。预期的分隔符似乎有点奇怪,因为您希望其中一些使用双制表符,因此使用零字节字符串,即"".

如果您只想在脚本中使用该命令,则只需编辑脚本文件以包含该脚本即可。EOF如果学习heredocs是预期目的,请将学习与脚本改进结合起来。 :)

相关内容