我遇到以下有关 sed 命令的问题。我想做的是:
sed '1 d' filename.fa | sed "1i\>filename\n" > filename_Edited.fa
其中文件第一行被替换为“>文件名”。此操作分两步完成:删除第一行,然后插入包含所需“>文本”的新行。如果直接在控制台中输入该命令(不带变量),则该命令的工作方式与上面所写的相同。但是,我需要将此命令集成到以下脚本中,其中文件名现在取决于变量:
#!/bin/bash
CODE=`cut -c 7-21 Data.txt`
cd ../FASTA_SEC/
for i in ${CODE}
do
sed '1 d' ${CODE}.fa | sed "1i\>${CODE}\n" > ${CODE}_Edited.fa
done
当为每个 for 循环迭代运行此脚本时,我收到以下错误:
try: line 8: ${CODE}_Edited.fa: ambiguous redirect
我不明白 sed sintaxis 或整个脚本有什么问题,显然它应该可以工作,但不能。有什么线索吗?
我还尝试运行不带管道部分的脚本,仅执行 sed 从文本中删除第一行:
#!/bin/bash
CODE=`cut -c 7-21 Data.txt`
cd ../FASTA_SEC/
for i in ${CODE}
do
sed '1 d' ${CODE}.fa > ${CODE}_Edited.fa
done
但是,它再次返回之前的错误!
谢谢你的帮助!
**.fa 格式称为 fasta,是一种用于 DNA 序列的纯文本格式
答案1
sed
不使用前缀可能更简单,而是cat
:
#!/bin/bash
header=$(mktemp)
scratch=$(mktemp)
trap "rm -f $header $scratch" EXIT
cd ../FASTA_SEC/
for CODE in $(cut -c 7-21 Data.txt); do
echo ">${CODE}_" > $header
if [[ -r "${CODE}.fa" ]]; then
sed '1d' "${CODE}.fa" > $scratch
cat $header $scratch > ${CODE}_Edited.fa
fi
done