выравнивание по нескольким столбцам

Предлагаю купить третий диск /dev/sdc...

Сделайте на нем точно такую ​​же таблицу разделов, что и /dev/sdaи установите grub2, затем отправьте данные на свой новый /dev/sdc/диск, посмотрите, как система отреагирует на grub2и если все в порядке, то у вас будет новая «аварийная система» и диск «восстановления данных».

Самая большая проблема, которую я могу заметить с вашим подходом, это:

(compressing something, omitting something else, adding extra backups etc, etc)

Вы не можете рассчитывать на полностью работоспособную систему, если есть какое-то упущение. А это может быть опаснее, чем возлагать все свои надежды на диск для «восстановления данных».

Я считаю, что это самый быстрый способ решить вашу проблему, поскольку вы сказали, что это было вашей самой большой проблемой.

0
21.11.2019, 05:31
5 ответов

Использование paste, grepиsed:

paste -d ' '\
 <(grep -v '"' file)\
 <(grep -v '\.xml' file | sed 's/^[[:blank:]]*//;s/id=.*//')

Первый grepполучает все строки без двойных кавычек. Это пустые строки, строки, содержащие идентификаторы и имена файлов XML. Второй grepполучает все строки, не содержащие имена файлов XML. Начальные символы пробела/табуляции и строки, начинающиеся с id=, удаляются. Оба результата объединены с pasteс использованием пробела в качестве разделителя.

1
28.04.2021, 23:27

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

Фрагменты одинакового размера находятся с помощью регулярных выражений, когда количество новых строк совпадает в двух фрагментах.

$ perl -l -00 -ne '
      ($line, $str) = (qr/.*\n/, q/.*\n/);
      s/$/\n/;s/($line)//;printf $1;
       while (
           /^
                ($line)($line*)
                (?{ $n = $2 =~ tr|\n|\n| })
                (??{ $str. ($str x $n)  })
             $ 
           /x
        ) {
          s/($line)((?:$line){$n})($line)/$2/x;
          print "$1\n$3" =~ tr/\n//dr;
        }
        printf "\n";
' file

Результаты:

   id=ABC name=Banana DB Connection type=FruitMarket
    XYZ_1 ABC.xml    "Fruits/Mango/#Common"
    XYZ_2 ABC.xml    "Fruits/Mango/#Bizzare"
    XYZ_3 ABC.xml    "Fruits/Mango/#Common"

    id=EFG name=FruitHouse type=jms
    XYZ_4 EFG.xml    "Fruits/Plum Orange"

    id=JKL name=JMSWriteConnect type=jms
    XYZ_4 JKL.xml    "Fruits/Plum Orange"

    id=TMZ name=Banana DB Connection type=FruitMarket
    XYZ_5 TMZ.xml    "Fruits/Mango/Backup/Apple"

    id=LDL name=Banana DB Market-Connect type=FruitMarket
    XYZ_6 LDL.xml    "Fruits/Mango/#Common"
    XYZ_7 LDL.xml    "Fruits/Mango/#Common"
    XYZ_8 LDL.xml    "VEG/Mango/#NOT"
    XYZ_9 LDL.xml    "Fruits/Mango/#Common"
    XYZ_10 LDL.xml    "Fruits/Mango/#NOT"
    XYZ_11 LDL.xml    "Fruits/Mango/#Common"
0
28.04.2021, 23:27

Метод, использующий чистые манипуляции с массивами:

$ perl -F'\n' -l -00 -nae '
     print $\, shift @F;
     push @A, shift @F while @F > @A;
     print shift @A, $_ for @F;
' file

 -l will make print attach newlines.
 -00 is the paragraph mode
 -n reads file a record at a time.
 -F splits the current record (= paragraph in our case) 
 around newlines and stores them in
  zero indexed array @F. 
0
28.04.2021, 23:27

При условии, что всегда имеется ровно одна строка заголовка (id/name/type )для каждой записи, а тело записи состоит из равного количества строк XYZ _n LDL.xml и категории (фруктов. /veg )строки одну за другой, вы можете использовать GNU awk(gawk)в режиме абзаца с Getline/Variable/Coprocess для связи с prкомандой разбивки на две колонки -:

. ]
  BEGIN {
    RS = ""; FS = "\n"; 
    cmd = "pr -T -s -2"
  }
  {
    print $1; 
    for(i=2;i<=NF;i++) 
      print $i |& cmd; 
    close(cmd,"to"); 
    while((cmd |& getline line) > 0) 
      print line; 
    close(cmd); 
    print ""
  }
' file
   id=ABC name=Banana DB Connection type=FruitMarket
    XYZ_1 ABC.xml       "Fruits/Mango/#Common"
    XYZ_2 ABC.xml       "Fruits/Mango/#Bizzare"
    XYZ_3 ABC.xml       "Fruits/Mango/#Common"

    id=EFG name=FruitHouse type=jms
    XYZ_4 EFG.xml       "Fruits/Plum Orange"

    id=JKL name=JMSWriteConnect type=jms
    XYZ_4 JKL.xml       "Fruits/Plum Orange"

    id=TMZ name=Banana DB Connection type=FruitMarket
    XYZ_5 TMZ.xml       "Fruits/Mango/Backup/Apple"

    id=LDL name=Banana DB Market-Connect type=FruitMarket
    XYZ_6 LDL.xml       "Fruits/Mango/#Common"
    XYZ_7 LDL.xml       "Fruits/Mango/#Common"
    XYZ_8 LDL.xml       "VEG/Mango/#NOT"
    XYZ_9 LDL.xml       "Fruits/Mango/#Common"
    XYZ_10 LDL.xml      "Fruits/Mango/#NOT"
    XYZ_11 LDL.xml      "Fruits/Mango/#Common"
2
28.04.2021, 23:27

Перл:

perl -00 -F'\n' -anE '
    $n = ($#F + 1)/2;
    say $F[0];
    say $F[$_], $F[$_+$n] for (1..$n);
    say "";
' raw
  • -00разбивает файл на абзацы
  • -F'\n'использует новую строку в качестве разделителя полей
  • -a"авторазбивает" запись на поля, хранящиеся в массиве @F
  • -nперебирает записи в файле
   id=ABC name=Banana DB Connection type=FruitMarket
    XYZ_1 ABC.xml    "Fruits/Mango/#Common"
    XYZ_2 ABC.xml    "Fruits/Mango/#Bizzare"
    XYZ_3 ABC.xml    "Fruits/Mango/#Common"

    id=EFG name=FruitHouse type=jms
    XYZ_4 EFG.xml    "Fruits/Plum Orange"

    id=JKL name=JMSWriteConnect type=jms
    XYZ_4 JKL.xml    "Fruits/Plum Orange"

    id=TMZ name=Banana DB Connection type=FruitMarket
    XYZ_5 TMZ.xml    "Fruits/Mango/Backup/Apple"

    id=LDL name=Banana DB Market-Connect type=FruitMarket
    XYZ_6 LDL.xml    "Fruits/Mango/#Common"
    XYZ_7 LDL.xml    "Fruits/Mango/#Common"
    XYZ_8 LDL.xml    "VEG/Mango/#NOT"
    XYZ_9 LDL.xml    "Fruits/Mango/#Common"
    XYZ_10 LDL.xml    "Fruits/Mango/#NOT"
    XYZ_11 LDL.xml    "Fruits/Mango/#Common"
2
28.04.2021, 23:27

Теги

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