отформатировать вывод сценария оболочки в виде таблицы

В современных системах RedHat очень сложно избежать более 300 000 строк C, которыми является NetworkManger.

Мне удалось заставить NetworkManager не изменять настройки DNS на Centos7 со следующим в/etc/NetworkManager/NetworkManager.conf

[main]
plugins=ifcfg-rh
dns=none
rc-manager=unmanaged
1
17.02.2020, 16:46
4 ответа

Использование awkи табуляции и |в качестве разделителей:

awk -F: '
  BEGIN{ printf "%s\t|%s\t|%s","Roll Number","Mobile Number","Grade"}
  { gsub(/ /,"",$2); printf "%s", ($1 ~ "^Roll" ? RS : "\t|") $2 }
  END { print "" }
' file

В блоке BEGINраспечатайте заголовок, используя табуляцию и |между каждым полем.
Затем удалите все символы пробела из второго поля (в начале и в конце )и

.
  1. если первое поле начинается с Roll, добавьте разделитель записейRS(перевод строки ), иначе напечатайте табуляцию и|
  2. напечатать второе поле

В блоке ENDвыведите еще одну новую строку.

Выход:

Roll Number     |Mobile Number  |Grade
187437366       |07995036927    |A
187437367       |07995036937    |B
0
28.04.2021, 23:23

Один вкладыш:

$ awk -F':' '{printf "%s%s", $2, (/^Grade/)?"\n":"\t|"}' file

Выход:

 187437366      | 07995036927   | A
 187437367      | 07995036937   | B
1
28.04.2021, 23:23

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

% mlr --ixtab --ips : --opprint cat << END
Roll number               : 187437366
Mobile Number             : 07995036927
Grade                     : A

Roll number               : 187437367
Mobile Number             : 07995036937
Grade                     : B

END
Roll number                Mobile Number              Grade
 187437366                  07995036927                A
 187437367                  07995036937                B
%

Просто сделайте так, чтобы ваш скрипт выводил пустую строку после каждой записи, или добавьте промежуточный фильтр, который делает это, и вы получите формат ввода "XTAB" с :в качестве символа "разделителя пар" (ср. опции --ixtabи --ips).

Вышеуказанный формат вывода "PPRINT". Для вывода, более похожего на вопрос, есть опция --barredдля «PPRINT» и альтернативный формат вывода «Markdown» с --omd. Однако у меня нет свежей версии Миллера для демонстрации.

1
28.04.2021, 23:23

Без привязки вашего кода к каким-либо значениям данных во входном файле, а вместо этого просто полагаясь на повторяющиеся значения вашего заголовка:

$ cat tst.awk
BEGIN {
    FS = "[[:space:]]*:[[:space:]]*"
    OFS = "|"
}
seen[$1]++ { prt() }
{
    hdrs[++numFlds] = $1
    vals[numFlds] = $2
}
END { prt() }

function prt(   fldNr) {
    if ( !doneHdr++ ) {
        for (fldNr=1; fldNr<=numFlds; fldNr++) {
            printf "%s%s", hdrs[fldNr], (fldNr<numFlds ? OFS : ORS)
        }
    }
    for (fldNr=1; fldNr<=numFlds; fldNr++) {
        printf "%s%s", vals[fldNr], (fldNr<numFlds ? OFS : ORS)
    }
    numFlds = 0
    delete seen
}

.

$ awk -f tst.awk file | column -s'|' -o' | ' -t
Roll number | Mobile Number | Grade
187437366   | 07995036927   | A
187437367   | 07995036937   | B
0
28.04.2021, 23:23

Теги

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