697] Преобразование строк в столбцы

Основной процесс начальной загрузки

Личинка

  1. Личинка читает свой диск, md, файловую систему, и т.д. кодируйте от MBR.
  2. Личинка находит свой / раздел начальной загрузки и читает остальную часть себя из нее. Включая конфигурацию и любые модули конфигурация указывает загрузку потребности.
  3. Личинка следует инструкциям в конфигурации, которые обычно говорят ей загружать ядро и initramfs в память, и выполнять ядро.

Существует режим нейтрализации, поскольку, когда Личинка не может на самом деле считать файловую систему — или потому что не было достаточного количества пространства для встраивания всего этого кода в загрузочной записи, или потому что это не знает файловую систему или слои под ним. В этом случае GRUB встраивает список секторов и читает код от них. Это намного менее устойчиво, и лучше всего избегаемое. Это может даже смочь сделать ядро и initramfs как этот (не уверенный).

Ядро

Ядро затем берет на себя управление и делает много базового оборудования init. Этот этап довольно быстр. Затем, ядро распаковывает initramfs к tmpfs и ищет a /init на этом tmpfs. Это затем выполняется (в нормальном смысле, ядро заправляет выполнение горючим в этой точке), /init. Это, между прочим, простой сценарий оболочки.

Initramfs

Можно извлечь initramfs вручную путем выполнения чего-то как mkdir /tmp/foo; cd /tmp/foo; zcat /boot/initrd.img-3.8-trunk-amd64 | cpio -idmv.

initramfs ответственен за загрузку всех драйверов, запуск udev и нахождение корневой файловой системы. Это - шаг, который перестал работать для Вас — он не может найти корневую файловую систему, таким образом, он прыгает с парашютом.

После того как initramfs закончился, ему смонтировали корневую файловую систему и передает управление/sbin/init.

Начальная загрузка системы

На данном этапе Ваш init вступает во владение — я думаю, что Ubuntu использует выскочку в настоящее время.

Что повреждается

Я не совсем уверен, что повредилось (часть, я признаюсь, потому что я намного более знаком с тем, как она работает над Debian, чем Ubuntu, хотя его подобное), но у меня есть несколько предложений:

  • initramfs имеет свою собственную копию mdadm.conf. Вы, возможно, просто должны работать update-initramfs -u зафиксировать его.
  • Посмотрите на сообщения загрузки. Может быть ошибка. Избавьтесь от 'тихих' и 'плещитесь' и возможно добавьте 'подробный' к своей строке ядра для фактического наблюдения их.
  • В зависимости от используемого устройства хранения данных Вы, возможно, должны установить rootdelay параметр.
  • Когда Вы выводитесь к приглашению оболочки, у Вас нет большого количества команд, но у Вас действительно есть mdadm. Попытайтесь выяснить то, что пошло не так, как надо. При решении проблемы начальная загрузка может продолжиться.
10
01.02.2016, 21:06
7 ответов

Если пройти файл дважды не является (большой) проблемой (будет сохранен только один строка в памяти):

awk -F : '{printf("%s\t ", $1)}' infile
echo
awk -F : '{printf("%s\t ", $2)}' infile

Что для общего количества полей будет (которое может иметь много проходов по файлу):

#!/bin/bash
rowcount=2
for (( i=1; i<=rowcount; i++ )); do
    awk -v i="$i" -F : '{printf("%s\t ", $i)}' infile
    echo
done

Но для действительно общего транспонирования это будет работать:

awk '$0!~/^$/{    i++;
                  split($0,arr,":");
                  for (j in arr) {
                      out[i,j]=arr[j];
                      if (maxr<j){ maxr=j} # max number of output rows.
                  }
            }
    END {
        maxc=i                             # max number of output columns.
        for     (j=1; j<=maxr; j++) {
            for (i=1; i<=maxc; i++) {
                printf( "%s\t", out[i,j])  # out field separator.
            }
            printf( "%s\n","" )
        }
    }' infile

И чтобы сделать это довольно (с использованием табуляции \ t в качестве разделителя выходных полей):

./script | |column -t -s $'\t'

Virtual_Machine  ID                                Status   Memory  Uptime  Server              Pool     HA     VCPU  Type     OS
OL6U7            0004fb00000600003da8ce6948c441bd  Running  65536   17103   MyOVS1.vmworld.com  HA-POOL  false  16    Xen PVM  Oracle Linux 6

Приведенный выше код для общего транспонирования сохранит всю матрицу в памяти.
Это может быть проблемой для очень больших файлов.


Обновление для нового текста.

Для обработки нового текста, размещенного в вопросе, мне кажется, что два прохода awk - лучший ответ. Один проход, настолько короткий, насколько существуют поля, будет печатать заголовки полей заголовка.На следующем проходе awk будет напечатано только поле 2. В обоих случаях я добавил способ удаления начальных и конечных пробелов (для лучшего форматирования).

#!/bin/bash
{
awk -F: 'BEGIN{ sl="Virtual Machine"}
         $1~sl && head == 1 { head=0; exit 0}
         $1~sl && head == 0 { head=1; }
         head == 1 {
             gsub(/^[ \t]+/,"",$1);   # remove leading  spaces
             gsub(/[ \t]+$/,"",$1);   # remove trailing spaces
             printf( "%s\t", $1)
         }
         ' infile
#echo
awk -F: 'BEGIN { sl="Virtual Machine"}
         $1~sl { printf( "%s\n", "") }
         {
             gsub(/^[ \t]+/,"",$2);   # remove leading  spaces
             gsub(/[ \t]+$/,"",$2);   # remove trailing spaces
             printf( "%s\t", $2)
         }
         ' infile
echo
} | column -t -s "$(printf '%b' '\t')"

Окрестности {...} | column -t -s "$ (printf '% b' '\ t')" предназначен для удобного форматирования всей таблицы.
Обратите внимание, что "$ (printf '% b' '\ t')" можно заменить на $ '\ t' в ksh, bash или zsh.

1
27.01.2020, 20:01

РЕДАКТИРОВАТЬ: Расширяется до любое количество выходных строк в простом однострочном для цикла :

for ((i=1;i<=2;i++)); do cut -d: -f "$i" input | paste -sd: ; done | column -t -s:

Исходный ответ:

Вы можете сделать это как однострочное, используя замену процесса bash :

paste -sd: <(cut -d: -f1 input) <(cut -d: -f2 input) | column -t -s:

Параметр -s для вставки позволяет обрабатывать каждый файл по одному. Разделитель : , заданный в вставке , «перехватывается» параметром -s в столбце в конце, чтобы упорядочить формат выстраивая поля в линию.

Команды вырезать в двух подстановках процесса вытягивают первое поле и второе поле соответственно.

Есть ли во вводе пустые строки или нет, не имеет значения, поскольку column -t -s: очистит вывод независимо. (В исходном вводе, указанном в вопросе, были пустые строки, но с тех пор они были удалены. Вышеупомянутая команда работает независимо от пустых строк.)

Входные данные - содержимое файла с именем "input" в приведенной выше команде:

Virtual_Machine:OL6U7

ID:0004fb00000600003da8ce6948c441bd

Status:Running

Memory:65536

Uptime:17103

Server:MyOVS1.vmworld.com

Pool:HA-POOL

HA:false

VCPU:16

Type:Xen PVM

OS:Oracle Linux 6

Вывод:

Virtual_Machine  ID                                Status   Memory  Uptime  Server              Pool     HA     VCPU  Type     OS
OL6U7            0004fb00000600003da8ce6948c441bd  Running  65536   17103   MyOVS1.vmworld.com  HA-POOL  false  16    Xen PVM  Oracle Linux 6
6
27.01.2020, 20:01

Если у вас есть доступная утилита rs (изменение формы) , вы можете сделать следующее:

rs -Tzc: < input.txt

Это дает выходной формат точно такой, как указано в вопросе, вплоть до ширины динамических столбцов.

  • -T Транспонирует входные данные
  • -z соответствующим образом изменяет размер столбцов от максимального значения в каждом столбце
  • -c: использует двоеточие в качестве разделителя поля ввода

Это работает для таблиц произвольного размера, например:

$ echo "Name:Alice:Bob:Carol
Age:12:34:56
Eyecolour:Brown:Black:Blue" | rs -Tzc: 
Name   Age  Eyecolour
Alice  12   Brown
Bob    34   Black
Carol  56   Blue
$ 

rs доступен по умолчанию на OS X (и, вероятно, на других машинах BSD). Его можно установить в Ubuntu (и семействе Debian) с помощью:

sudo apt-get install rs
8
27.01.2020, 20:01
declare -a COLS
declare -a DATA
while IFS=':' read -ra fields; do
   COLS+=("${fields[0]}")
   DATA+=("${fields[1]}")
done < <( cat /path/to/input.txt)

HEADER=""
DATA=""
for i in $(seq 0 $((${#fields[@]}-1)); do
    HEADER="${HEADER}${COLS[$i]} "
    DATA="${DATA}${COLS[$i]} "
done
echo $HEADER
echo $DATA
1
27.01.2020, 20:01

С gnu datamash и столбец из util-linux :

datamash -t: transpose <infile | column -t -s:

Это работает с более чем двумя столбцами, но предполагает, что во входном файле нет пустых строк; с пустыми строками между ними (как в исходном образце входных данных) вы получите сообщение об ошибке вида:

datamash: transpose input error: line 2 has 0 fields (previous lines had 2);

, чтобы избежать их сжатия перед обработкой с помощью datamash :

tr -s \\n <infile | datamash -t: transpose | column -t -s:

В противном случае, в данном конкретном случае (только два столбца) с zsh и тем же столбцом :

list=(${(f)"$(<infile)"})
printf %s\\n ${(j;:;)list[@]%:*} ${(j;:;)list[@]#*:} | column -t -s:

($ {(f) "$ ( читает строки в массиве; $ {(j;:;) list [@]%: *} объединяет (с : ) первое поле каждого элемента и $ {(j;:; ) list [@] # *:} объединяет (снова с : ) второе поле каждого элемента; они оба напечатаны, например вывод

Virtual_Machine:ID:Status:Memory:Uptime:Server:Pool:HA:VCPU:Type:OS
OL6U7:0004fb00000600003da8ce6948c441bd:Running:65536:17103:MyOVS1.vmworld.com:HA-POOL:false:16:Xen PVM:Oracle Linux 6

, который затем передается по конвейеру в столбец -t -s:

1
27.01.2020, 20:01

Используя awk, сохраните ключ и значение и выведите их в конце.

#!/usr/bin/awk -f
BEGIN {
  CNT=0
  FS=":"
}

{
  HDR[CNT]=$1;
  ENTRY[CNT]=$2;
  CNT++;
}

END {
  for (x = 0; x < CNT; x++)
    printf "%s\t",HDR[x]

  print""

  for (x = 0; x < CNT; x++)
    printf "%s\t",ENTRY[x]
  }

Просто запустите awk -f ./script.awk ./input.txt

2
27.01.2020, 20:01

если ваши данные находятся в отдельных файлах в каталоге, вы можете использовать :

for file in $(ls $DIRECTORY)
do
  cat ${file} | while read line
  do
    value=$(echo $line | cut -d: -f2-)
    printf "%s\t" "${value}" >> bigfile
  done
  echo " " >> bigfile
done

вам может понадобиться изменить количество символов \t (табуляция) в строке printf, если значения переменных имеют разную длину.

-5
27.01.2020, 20:01

Теги

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