如何解决将文件名替换为bash中多个文件中第一行的字符串
我有多个fasta文件,其中第一行始终包含带有多个单词的>
,例如:
File_1.fasta:
>KY620313.1 Hepatitis C virus isolate sP171215 polyprotein gene,complete cds
File_2.fasta:
>KY620314.1 Hepatitis C virus isolate sP131957 polyprotein gene,complete cds
File_3.fasta:
>KY620315.1 Hepatitis C virus isolate sP127952 polyprotein gene,complete cds
我想从每个文件中使用sP*
开头的单词,并将每个文件重命名为该字符串(例如:File_1.fasta到sP171215.fasta)。
到目前为止,我有这个:
$ for match in "$(grep -ro '>')";do
fname=$("echo $match|awk '{print $6}'")
echo mv "$match" "$fname"
done
但是它不起作用,我总是会收到错误消息:
grep:警告:stdin的递归搜索
希望你能帮助我!
解决方法
此代码中发生了几件事。
首先,..我实际上没有得到这个特定的错误,这可能是由于版本不同。
可能会解决以下事实:由于bash扩展做得不好,grep将'>'
解释为与>
相同。我建议也许去"\>"
。
第二:
fname=$("echo $match|awk '{print $6}'")
里面的引号是出于非预期目的。您的代码应如下所示:
fname="$(echo $match|awk '{print $6}')"
最后,要正确检索数据,这应该是您的最终代码:
for match in "$(grep -Hr "\>")"; do
fname="$(echo "$match" | cut -d: -f1)"
new_fname="$(echo "$match" | grep -o "sP[^ ]*")".fasta
echo mv "$fname" "$new_fname"
done
说明:
grep -H
->您希望您的grep显式使用“包含文件名”,以防其他shell环境决定将grep
别名为grep -h (no filenames)
您不想在文件搜索中进行grep -o
,因为您希望在一个数据条目中同时包含文件名和“新文件名”。
尽管如此,我不明白为什么要搜索“>”而不是目录“ sP”:
for match in "$(grep -Hro "sP[0-9]*")"
这不是完全相同的行为,并且具有不同的边缘情况,但是它可能对您有用。
,您可以使用以下内容:
int newValue(int *p){
// modify the vector
return p;
}
int main(){
int a[6]={4,6,7,3,1,8};
int *p;
p = a;
p = newValue (p);
- 它搜索* .fasta文件并处理每条“命中”行
- 它将grep的每个结果均按空格分割,并将第6个元素作为新名称
- 它将grep的每个结果都用:分割,并获得第一个元素作为旧名称
- 它 从旧文件名移动/重命名到新文件名
在(g)awk中非常简单:
创建文件“ script.awk”:
FNR == 1 {
for (i=1; i<=NF; i++) {
if (index($i,"sP")==1) {
print "mv",FILENAME,$i ".fasta"
nextfile
}
}
}
使用它:
awk -f script.awk *.fasta > cmmd.txt
检查输出内容。
mv File_1.fasta sP171215.fasta
mv File_2.fasta sP131957.fasta
如果可以,请使用. cmmd.txt
启动重命名
对于目录中的所有fasta文件,请在其第一行中搜索以sP
开头的第一个单词,并使用该单词作为基名对其进行重命名。
使用bash数组:
for f in *.fasta; do
arr=( $(head -1 "$f") )
for word in "${arr[@]}"; do
[[ "$word" =~ ^sP* ]] && echo mv "$f" "${word}.fasta" && break
done
done
或使用grep:
for f in *.fasta; do
word=$(head -1 "$f" | grep -o "\bsP\w*")
[ -z "$word" ] || echo mv "$f" "${word}.fasta"
done
注意:可以进行测试后,删除echo
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。