Как разделить файл, содержащий имена файлов и информацию, на несколько файлов по отдельности? - PullRequest
0 голосов
/ 24 марта 2020

У меня есть file.txt, который выглядит следующим образом (я удалил строки, чтобы упростить мой пример):

PLXNA3                                                                                     ### <- filename1
Missense/nonsense : 13 mutations                                                           # <- header spaces
accession   codon_change    amino_acid_change                                              # <- column names tsv
ID73        CAT-TAT         His66Tyr                                                       # <- line tsv
ID63        GAC-AAC         Asp127Asn                                                      # <- line tsv
ID31        GCC-GTC         Ala307Val                                                      # <- line tsv
NEDD4L                                                                                     ### <- filename2
Splicing : 1 mutation                                                                      # <- header spaces
accession      splicing_mutation                                                           # <- column names tsv
ID51           IVS1 as G-A -16229                                                          # <-  line tsv
Gross deletions : 1 mutation                                                               # <- header spaces
accession   DNA_level   description                 HGVS_(nucleotide)   HGVS_(protein)     # <- column names tsv
ID853       gDNA        4.5 Mb incl. entire gene    Not yet available   Not yet available  # <- line tsv
OPHN1                                                                                      ### <- filename3
Small insertions : 3 mutations                                                             # <- header spaces
accession         insertion                            HGVS_(nucleotide)                   # <- column names tsv
ID96          TTATGTT(^183)TATtCAAATCCAGG c.549dupT    p.(Gln184Serfs*23)                  # <- line tsv
ID25          GTGCT(^310)AAGCAcaG_EI_GTCAGTTCT         c.931_932dupCA                      # <- line tsv

Я хотел бы разделить этот файл, чтобы получить 3 разных файла:

PLXNA3.txt

PLXNA3                                                                                     ### <- filename1
Missense/nonsense : 13 mutations                                                           # <- header spaces
accession   codon_change    amino_acid_change                                              # <- column names tsv
ID73        CAT-TAT         His66Tyr                                                       # <- line tsv
ID63        GAC-AAC         Asp127Asn                                                      # <- line tsv
ID31        GCC-GTC         Ala307Val                                                      # <- line tsv

NEDD4L.txt

NEDD4L                                                                                     ### <- filename2
Splicing : 1 mutation                                                                      # <- header spaces
accession      splicing_mutation                                                           # <- column names tsv
ID51           IVS1 as G-A -16229                                                          # <-  line tsv
Gross deletions : 1 mutation                                                               # <- header spaces
accession   DNA_level   description                 HGVS_(nucleotide)   HGVS_(protein)     # <- column names tsv
ID853       gDNA        4.5 Mb incl. entire gene    Not yet available   Not yet available  # <- line tsv

OPHN1

OPHN1                                                                                      ### <- filename3
Small insertions : 3 mutations                                                             # <- header spaces
accession         insertion                            HGVS_(nucleotide)                   # <- column names tsv
ID96          TTATGTT(^183)TATtCAAATCCAGG c.549dupT    p.(Gln184Serfs*23)                  # <- line tsv
ID25          GTGCT(^310)AAGCAcaG_EI_GTCAGTTCT         c.931_932dupCA                      # <- line tsv

Как мне достичь желаемого результата с помощью любых команд linux например awk или python?

Примечание:

  • имена файлов не имеют пробелов или табуляций, но могут содержать -. * 1029 Заголовок *
  • содержит пробелы.
  • строки разделены табуляцией.
  • реальный разделитель должен быть именами файлов, поскольку я могу иметь несколько заголовков.

Спасибо в заранее.

Ответы [ 2 ]

2 голосов
/ 24 марта 2020
awk 'NF==1{filename=$0 ".txt"};{print > filename}' file.txt

Эквивалентным, но еще более привлекательным вариантом для гольфа будет

awk 'NF==1{f=$0".txt"}{print>f}' file.txt
1 голос
/ 24 марта 2020

Итак, вот решение, которое я придумал. Сначала открывается файл, который вы хотите разделить. Затем в первой строке записывается имя файла для первого файла. Позвольте мне пока пропустить l oop. Он открывает новый файл с именем файла, которое было только что прочитано (strip () необходим, чтобы избавиться от символа новой строки в конце строки). Затем читает строки и записывает их в новый файл до тех пор, пока он не появится, в котором нет пробела или табуляции. Затем процесс повторяется до тех пор, пока в файле больше не останется строк для чтения (пока l oop я пропустил ранее).

Надеюсь, это поможет:)

file = open("file.txt", "r")

new_filename = file.readline()
while new_filename:
   with open(new_filename.strip() + ".txt", "w") as new_file:
      new_file.write(new_filename)
      line = file.readline()
      while " " in line or "\t" in line:
         # still the same new file
         new_file.write(line)
         line = file.readline()
   # file ended so read in line was the filename of the next file
   new_filename = line

file.close()
...