Объединение конкретных строк в 3 файла по определенному шаблону

Хорошо, похоже, что вы уже несколько раз переустанавливали систему, чтобы найти ответ, почему она не работает с двойной загрузкой. Я отвечу своим собственным опытом, который случался и со мной пару раз, с той разницей, что у меня просто был HDD для установки на обе ОС. Мои решения:

  1. Попытка live-boot в ubuntu
  2. Установите boot-repair, набрав следующие команды в терминале

    sudo add-apt-repository ppa:yannubuntu/boot-repair

    sudo apt-get update -y

    sudo apt-get install -y boot-repair && boot-repair

3. Когда появится программа, выберите 'recommended-repair'

4.Перезагрузите машину

Надеюсь, ваши ОС будут доступны для выбора в меню GRUB.

[источник: https://help.ubuntu.com/community/Boot-Repair]

1
26.07.2016, 03:27
3 ответа

Могут быть какие-то волшебные суперпупер мэшапы команд, но иногда «линейный» легче всего понять и поддерживать.

Итак, нам просто нужно отслеживать имя файла на основе строки заголовка и добавлять данные. Затем мы можем sort -u результаты, чтобы получить уникальные строки:

#!/bin/bash

# Clean out old results from previous runs
/bin/rm -f ko*

for file in $@
do
  filename=UNKNOWN
  echo Processing $file
  while read -r line
  do
    case $line in
      ko:*) printf "%s\n" "$line" >> $filename ;;
       ko*) filename=${line%% *} ; echo Switching to $filename ;;
        "") # Do nothing
            ;;
         *) echo Ignoring unknown line: $line
    esac
  done < $file
done

for file in ko*
do
  echo Making unique: $file
  sort -u -o $file $file
done

Мы можем запустить это с тремя исходными файлами:

$ ./pattern_split file1 file2 file3
Processing file1
Switching to ko00980
Switching to ko00982
Switching to ko00983
Processing file2
Switching to ko00980
Switching to ko00982
Switching to ko00983
Processing file3
Switching to ko00980
Switching to ko00982
Switching to ko00983
Making unique: ko00980
Making unique: ko00982
Making unique: ko00983

Мы видим, что он создал три файла, которые были сделаны уникальными. Рассмотрим первое:

$ cat ko00980
ko:K00001 E1.1.1.1; alcohol dehydrogenase [EC:1.1.1.1]
ko:K00079 CBR1; carbonyl reductase 1 [EC:1.1.1.184 1.1.1.189 1.1.1.197]
ko:K00121 frmA; S-(hydroxymethyl)glutathione dehydrogenase / alcohol dehydrogenase [EC:1.1.1.284 1.1.1.1]
ko:K00699 UGT; glucuronosyltransferase [EC:2.4.1.17]
ko:K00799 GST; glutathione S-transferase [EC:2.5.1.18]
ko:K07408 CYP1A1; cytochrome P450, family 1, subfamily A, polypeptide 1 [EC:1.14.14.1]
ko:K07409 CYP1A2; cytochrome P450, family 1, subfamily A, polypeptide 2 [EC:1.14.14.1]

Теперь это решение должно быть усилено против ложных данных в файлах данных (например, что, если есть файл ko123 / 456 ? Это сломается. Но это схема того, как можно решить проблему.

1
27.01.2020, 23:25

Итак, переместить строки в файле в отдельный файл на основе заголовка?

Думаю, что-то вроде этого поможет:

#!/usr/bin/env perl
use strict;
use warnings 'all'; 

#hash of output filehandles. 
my %output_files; 

#detect dupes
my %seen; 

my $ko_num = 'NULL'; 

#<> is the 'magic' filehandle. You can either use it to iterate STDIN
#or take a list of file names on the command line (just like sed/grep etc.)
while ( my $line = <> ) { 
   #see if the line starts with 'ko':
   if ( $line =~ m/(^ko\d+)/) {  
       $ko_num = $1;
       #open a new file - for overwriting (so we only do this once)
       open ( $output_files{$ko_num}, '>', $ko_num ) or die $! unless $output_files{$ko_num}; 
       #skip printing - could write a header here instead. 
       next;
   }
   #look for a 'K' number. 
   if ( my ($K_id) = $line =~ m/ko:(K\d+)/ ) {
       #skip it if we've already seen this combination of 'ko' number 
       #and k number.    
       next if $seen{$ko_num}{$K_id}++; 
       #print the output to this particular output file. 
       print {$output_files{$ko_num}} $line; 
   }
}
#close the filehandles. 
close ( $_ ) for values %output_files; 

Таким образом, вы можете запустить myscript.pl file1.txt file2.txt file3.txt, и он должен делать правильные вещи с возможностью масштабирования. Его даже не волнует, отдельные это файлы или единый поток.

0
27.01.2020, 23:25

С помощью awk вы можете запустить:

awk '/^ko[^:]/{fn=$1;next};/./{id=fn$1;if (!(seen[id]++)){print > fn}}' file[123]

В каждой строке заголовка он сохраняет идентификатор ko ***** как fn , в под- строки заголовка он сохраняет fn $ 1 1 как id , используя его как индекс массива , видимый , и если это первый раз, когда id ] видно, что он записывает строку в fn .


1: вы также можете использовать fn $ 0

2
27.01.2020, 23:25

Теги

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