В современных системах RedHat очень сложно избежать более 300 000 строк C, которыми является NetworkManger.
Мне удалось заставить NetworkManager не изменять настройки DNS на Centos7 со следующим в/etc/NetworkManager/NetworkManager.conf
[main]
plugins=ifcfg-rh
dns=none
rc-manager=unmanaged
Использование 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
распечатайте заголовок, используя табуляцию и |
между каждым полем.
Затем удалите все символы пробела из второго поля (в начале и в конце )и
Roll
, добавьте разделитель записейRS
(перевод строки ), иначе напечатайте табуляцию и|
В блоке END
выведите еще одну новую строку.
Выход:
Roll Number |Mobile Number |Grade
187437366 |07995036927 |A
187437367 |07995036937 |B
Один вкладыш:
$ awk -F':' '{printf "%s%s", $2, (/^Grade/)?"\n":"\t|"}' file
Выход:
187437366 | 07995036927 | A
187437367 | 07995036937 | B
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
. Однако у меня нет свежей версии Миллера для демонстрации.
Без привязки вашего кода к каким-либо значениям данных во входном файле, а вместо этого просто полагаясь на повторяющиеся значения вашего заголовка:
$ 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