Добавление разрыва строки в файл с разными столбцами на основе текста в столбце значений

Была такая же проблема. Я обнаружил, что можно использовать

-o APT::Cache::ShowOnlyFirstOr=true

что частично решает проблему, но не полностью -, например, когда вы иметь multiarch, и один и тот же пакет предоставляется в обеих архитектурах (, то есть не ИЛИ, а на самом деле два пакета, которые можно использовать ), тогда вы получаете рекурсию на обоих.

Думаю, я должен предупредить вас, что эта опция, похоже, не задокументирована. в любом месте. Кроме того, я не знаю, всегда ли предпочтительный вариант является первым.

(Посмотрите, как ShowOnlyFirstOr используется вhttps://salsa.debian.org/apt-team/apt/blob/master/apt-private/private-depends.cc)

4
24.06.2020, 16:38
2 ответа

Так как вы помечаете этот pbm тегом csh, вот способ cshell -ian сделать это. Цикл foreach считывает лиганды файла pdb _по каждой -строке, а затем разбивает строку на поля. Мы безоговорочно печатаем каждую строку, но выводим пустую строку, которая удовлетворяет показанному условию.

  #!/bin/csh -f
  set prev = ""
  @ line_num = 1
  foreach line ( "`cat pdb_ligands`" )
    set fields = ( ${line:x} )
    set curr = "${fields[1]}" 
    if ( "$line_num" > 1 && "$prev" != "$curr" ) echo
    printf '%s\n' "$line" 
    set prev = "$curr"
    @ line_num++
  end

Метод -GNU sed. Сохраняйте шаблонное пространство из двух последовательных строк, чтобы мы могли отслеживать любые изменения в первом столбце между двумя последовательными строками. Только если есть изменение в первых обнаруженных нами полях, мы выводим пустую строку посредством печати пустого пространства удержания.

$ sed -Ee '
    $q;N;P
    /^(\S+)\s.*\n\1\s/!{x;p;x;}
    D
' pdb_ligands 

Используя awk, мы читаем следующую строку и находим индекс первого поля текущей строки в следующей строке. Если это произойдет в начале, это означает, что это совпадение. Поэтому мы устанавливаем ORS на RS. В противном случае используется настройка пустой строки.

$ awk '{ while ( getline t > 0 ) {
      ORS = index(t, $1 FS)-1 ? RS RS : RS
      print; $0 = t }
}1' pdb_ligands 

Perl следует той же методике, что и awk.

$ perl -pae '
    print; $_ = <>;
    /^\Q$F[0]\E\s/ or print $/;
    redo if ! eof;
' pdb_ligands 

1aa6 HETATM 4MO A 803
1aa6 HETATM SF4 A 800

1ao0 HETATM 5GP A 467
1ao0 HETATM SF4 B 466
1ao0 HETATM SF4 C 466

1b0y HETATM SF4 A  87

1blu HETATM SF4 A 101
1blu HETATM SF4 A 102
1
18.03.2021, 23:24
    for i in `awk '{if(!seen[$1]++){print $1}}'  filename `; do sed -n '/'$i'/p'  filename ;echo -e "\n"; done



output

1aa6 HETATM 4MO A 803
1aa6 HETATM SF4 A 800


1ao0 HETATM 5GP A 467
1ao0 HETATM SF4 B 466
1ao0 HETATM SF4 C 466


1b0y HETATM SF4 A  87


1blu HETATM SF4 A 101
1blu HETATM SF4 A 102

питон

import re
uniqueele=[]
k=open('filename','r')
for i in k:
    q=i.split(' ')[0]
    if q not in uniqueele:
        uniqueele.append(q)


for g in uniqueele:
    o=re.compile(r'{0}'.format(g))
    t=open('filename','r')
    for h in t:

        if re.search(o,h):
            print h.strip()

    print "\n"

выход

1aa6 HETATM 4MO A 803
1aa6 HETATM SF4 A 800


1ao0 HETATM 5GP A 467
1ao0 HETATM SF4 B 466
1ao0 HETATM SF4 C 466


1b0y HETATM SF4 A  87


1blu HETATM SF4 A 101
1blu HETATM SF4 A 102
0
18.03.2021, 23:24

Теги

Похожие вопросы