Unix 删除同名段落

Unix 删除同名段落,unix,awk,Unix,Awk,我想删除同样命名的段落(包含不同的数据字符串,在我的例子中是DNA) 例如,我的文件是: >blue 1. agccttgatcgttac 2. tttactaaagatgat 3. agccttga >orange 1. tttactaaagatg 2. agccttgatcgtt 3. tttacta >blue 1. caatgcatgcaga 2. agccttgatcgtt 3. tttactaaagatg 4. caatgca 我想删除所有同名段落,只留下其中一

我想删除同样命名的段落(包含不同的数据字符串,在我的例子中是DNA)

例如,我的文件是:

>blue
1. agccttgatcgttac
2. tttactaaagatgat
3. agccttga
>orange
1. tttactaaagatg
2. agccttgatcgtt
3. tttacta
>blue
1. caatgcatgcaga 
2. agccttgatcgtt
3. tttactaaagatg
4. caatgca

我想删除所有同名段落,只留下其中一段(在本例中为“>”蓝色)。每段以“>”开头。我该怎么做呢?

我敢肯定,同事们可能会提供更优雅的方式,但这里有一个又快又脏的方式:

cat in.txt |grep "^>"|sort|awk ' p == $0; { p = $0 }' >headers.txt
cp in.txt out.txt
while read in; do
    cat out.txt| sed "/^$in/,/^>/{//!d}"|sed "/^$in/d" >temp.txt
    mv temp.txt out.txt
done < headers.txt
cat in.txt | grep“^>“| sort | awk”p==0美元;{p=$0}'>headers.txt
cp in.txt out.txt
阅读时;做
cat out.txt | sed“/^$in/,/^>/{/!d}”| sed“/^$in/d”>temp.txt
mv temp.txt out.txt
完成
给定
in.txt
作为输入文件,您将
out.txt
作为输出,并在
headers.txt
中列出已删除的段落名称

请注意,我使用awk删除了所有出现的重复命名段落。

awk -v RS="\">\"" '{c=0;name=name" "$1;split(name,arr);for(i in arr){if(arr[i]==$1){++c}};if(c==1){print RS $0;next}}' file > new_file
示例如果您有数据

">"orange
    tttactaaagatg
    agccttgatcgtt
    tttacta
">"blue
    caatgcatgcaga
    agccttgatcgtt
    tttactaaagatg
    caatgca
">"blue
    caatgcatgcaga
    agccttgatcgtt
    tttactaaagatg
    caatgca
">"orange

    tttactaaagatg
    agccttgatcgtt
    tttacta
">"green

    tttactaaagatg
    agccttgatcgtt
    tttacta
结果

">"orange
    tttactaaagatg
    agccttgatcgtt
    tttacta

">"blue
    caatgcatgcaga
    agccttgatcgtt
    tttactaaagatg
    caatgca

">"green

    tttactaaagatg
    agccttgatcgtt
    tttacta

这是awk的一项简单工作

awk '/^>/ { print_it = 0; if (seen[$1]++ == 0) print_it = 1 }
          { if (print_it) print }'

这将保留具有给定标题的第一段。如果您需要保留最后一段,您必须更加努力。

是否要删除文件开头重复的字符串,或者直到空格、逗号或任何标点符号为止都相同的字符串?David,对不起,我想删除(在本例中)一个标题(-blue)和相关字符串(anothertextex)直到下一个标题的下一个符号“-”。字符串彼此不同(所有字符串都不同)。让我这样说:您想消除名称相同的段落吗?这可能涉及一些严重的
awk
使用。编辑您的问题并添加:“段落以…分隔”,并说明哪个字符或字符串表示段落结尾。
$ awk '/^>/{seen=cnt[$0]++} !seen' file
>blue
1. agccttgatcgttac
2. tttactaaagatgat
3. agccttga
>orange
1. tttactaaagatg
2. agccttgatcgtt
3. tttacta