2015-02-14 2 views
1

Я хотел бы исключить одинаково названные параграфы (содержащие разные строки данных, ДНК в моем случае).Устранение одинаково названных абзацев

Например мой файл:

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

Я хотел бы, чтобы удалить все одинаково названные пункты, оставив только один из них (в данном случае, если один из «>» синий). Каждый абзац начинается с «>». Как я могу это сделать?

+0

Вы хотите удалить повторяющиеся строки в начале файла или строки, которые совпадают до пробела или запятой или любой другой точки пунктуации? –

+0

Дэвид, извините, я хочу исключить (в данном случае) один заголовок (-blue) и связанные строки (anothertextex) до следующего символа «-» следующего заголовка. Строки отличаются друг от друга (все они). – user3660245

+0

Позвольте мне сказать так: вы хотите исключить одинаково названные параграфы? Это может привести к чрезмерному использованию awk. Измените свой вопрос и добавьте: «Параграф разделен с ...» и укажите, какой символ или строка обозначают конец абзаца. –

ответ

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

Отметьте, что я удаляю ВСЕ Вложения дублированных названий.

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 
+0

Отличная работа Xorg !! – user3660245

0

Это простая работа для awk:

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

Это сохраняет первый абзац с данным заголовком. Если вам нужно сохранить последний такой абзац, вам придется работать намного сложнее.

Смежные вопросы