消除同名的段落

时间:2015-02-14 18:02:34

标签: 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

我想删除所有同名的段落,只留下其中一个(在这种情况下,其中一个是">"蓝色)。每个段落以">"开头。我怎么能这样做?

4 个答案:

答案 0 :(得分:1)

$ awk '/^>/{seen=cnt[$0]++} !seen' file
>blue
1. agccttgatcgttac
2. tttactaaagatgat
3. agccttga
>orange
1. tttactaaagatg
2. agccttgatcgtt
3. tttacta

答案 1 :(得分:0)

我确信,同事们可能会提供更优雅的方式,但这里的内容很快而且很脏:

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

in.txt作为输入文件,您将out.txt作为输出,并在headers.txt中获取已删除的段落名称列表。

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

答案 2 :(得分:0)

使用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

答案 3 :(得分:0)

对于awk来说,这是一项简单的工作:

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

这使第一段保留给定标题。如果你需要保留最后一段这样的段落,你必须更加努力。