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是预期目的,请将学习与脚本改进结合起来。 :)