微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将文件名替换为bash中多个文件中第一行的字符串

如何解决将文件名替换为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);
  1. 它搜索* .fasta文件并处理每条“命中”行
  2. 它将grep的每个结果均按空格分割,并将第6个元素作为新名称
  3. 它将grep的每个结果都用:分割,并获得第一个元素作为旧名称
  4. 它 从旧文件名移动/重命名到新文件名
,

在(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 举报,一经查实,本站将立刻删除。