Преобразование строк в столбцы - PullRequest
0 голосов
/ 28 мая 2020

Я использовал этот сценарий для генерации следующего вывода с сервера show /system1/swid*" |egrep -w "name|VersionString" | sed 's/^[ \t]*//;s/[ \t]*$//', но я не могу преобразовать эти строки в столбцы. пожалуйста, помогите мне придумать, как преобразовать это в столбцы.

name=iLO
VersionString=2.73 Feb 11 2020
name=System ROM
VersionString=P89 v2.76 (10/21/2019)
name=Redundant System ROM
VersionString=P89 v2.64 (10/17/2018)
name=Intelligent Provisioning
VersionString=2.70.75

Требуемый вывод

    name=iLO                            name=System ROM                             name=Redundant System ROM                   name=Intelligent Provisioning
VersionString=2.73 Feb 11 2020      VersionString=P89 v2.76 (10/21/2019)        VersionString=P89 v2.64 (10/17/2018)        VersionString=2.70.75

изображение

Ответы [ 3 ]

1 голос
/ 29 мая 2020

Если разрешены необычные утилиты, используйте sed, datamash и * Steve Kinzler's * align:

sed -n 's/.*/&\t/;N;s/\n//p' file | 
datamash transpose | align  -j _ -g 3

Вывод :

name=iLO                         name=System ROM                        name=Redundant System ROM              name=Intelligent Provisioning
VersionString=2.73 Feb 11 2020   VersionString=P89 v2.76 (10/21/2019)   VersionString=P89 v2.64 (10/17/2018)   VersionString=2.70.75

Если выравнивание по центру текст требуется, просто добавьте -a c в конец, например:

sed -n 's/.*/&\t/;N;s/\n//p' file | 
datamash transpose | align  -j _ -g 3 -a c

Вывод:

           name=iLO                        name=System ROM                   name=Redundant System ROM         name=Intelligent Provisioning
VersionString=2.73 Feb 11 2020   VersionString=P89 v2.76 (10/21/2019)   VersionString=P89 v2.64 (10/17/2018)       VersionString=2.70.75
0 голосов
/ 29 мая 2020
#!/bin/bash
# these are arrays
declare -a headers
declare -a values

# loop over versions.txt
while read line
do
    # add array elements
    if [ "${line:0:5}" == "name=" ]; then
        headers+=("${line}")
    else
        values+=("${line}")
    fi
done < versions.txt

# start lines
values_line="${values[0]}"
header_line="    ${headers[0]}"
# Loop over arrays
for (( ii=1; ii<${#headers[@]}; ii++ )); do
    # Determine number of spaces to add to header line
    spaces=$(( ${#values_line} - ${#header_line} ))
    # add spaces
    for (( jj=0; jj<${spaces}; jj++ )); do
        header_line="${header_line} "
    done
    # Append current values to lines
    header_line="${header_line}        ${headers[ii]}"
    values_line="${values_line}    ${values[ii]}"
done
# output lines
echo "${header_line}"
echo "${values_line}"
0 голосов
/ 28 мая 2020

Вы можете сделать это:

awk '
/^name/{ names= $0 ";" names} 
!/^name/ && NF{data= $0 ";" data} 
END { printf("%s\n%s\n",names,data)}' input.txt

Что напечатает:

name=Intelligent Provisioning;name=Redundant System ROM;name=System ROM;name=iLO;
VersionString=2.70.75;VersionString=P89 v2.64 (10/17/2018);VersionString=P89 v2.76 (10/21/2019);VersionString=2.73 Feb 11 2020;

Надеюсь, это будет полезно для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...