Преобразование построчного блока вывода программы в CSV при удалении заголовков строк

Или с перлом:

perl -pe 's/(\d),(\d)/$1$2/g' infile.txt

который просто удаляет все запятые, окруженные цифрами (\d ).

Я предположил, что удаление разделителей тысяч было сутью в вашей задаче -а не в какой колонке стоят запятые.

0
18.12.2019, 13:03
7 ответов
awk '
  NF==1 { printf "%s%s", NR==1 ? "" : ORS, $1 }
  NF==2 { printf ",%s", $2 }
  END   { printf "%s", ORS }
' file
  • Если в строке одно поле :
    • печатать новую строку, если это не первая строка
    • поле печати 1
  • Если строка содержит два поля, выведите запятую и поле2
  • Наконец, напечатать новую строку
2
28.01.2020, 02:29
# will be used to remember the previous line
b=;
while read -r a; do 
 # if the previous line was empty, then this line is a title line
 if [ "$b" == "" ]; 
  then echo;
  echo -n $a; 
 # else only output everything after ": "
 else IFS=": " read -r _ digs <<< "$a"; 
 # don't want to output a comma for a blank line
  if [ "$a" != "" ]; 
   then echo -n,$digs;
  fi;
 fi;
 b=$a; 
done < 2

Выход:

 
Server1:,8,24,2  
Server2:,16,32,5 

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

0
28.01.2020, 02:29

sed решение.

$ cat file.txt
Server1:
CPU(S):  8
RAM: 24
Socket: 2

Server2:
CPU(S):  16
RAM: 32
Socket: 5
$ sed -n '/^Server/{s/ *$//;N;s/\n.*: */,/;s/ *$//;N;s/\n.*: */,/;s/ *$//;N;s/\n.*: */,/;p}' file.txt
Server1:,8,24,2
Server2:,16,32,5
$
0
28.01.2020, 02:29

С достаточно свежей 1 версией Миллера

mlr --idkvp --irs '\n\n' --ifs '\n' --ips ':' --ocsvlite --headerless-csv-output \
  clean-whitespace then put 'x=$[[1]]; $[[1]]="1"; $1=x' then remove-empty-columns \
  inputfile

Пояснение:

  • --idkvp --irs '\n\n' --ifs '\n' --ips ':' --ocsvlite --headerless-csv-outputустановить формат ввода в режим абзаца с парами значений ключа -, разделенными двоеточием, и одним полем в строке; установите формат вывода на csvliteи запретите печать заголовка имени поля

  • clean-whitespaceубрать начальные и конечные пробелы из значений поля

  • put 'x=$[[1]]; $[[1]]="1"; $1=x'установите значение первого поля равным его имени 2 и установите его имя равным "1". Последнее важно, так как оно гомогенизирует записи -, в противном случае Миллер печатает каждую запись как отдельный блок CSV, даже когда действует --headerless-csv-output.

  • remove-empty-columnsпоскольку с --irs '\n\n' --ifs '\n'одиночная новая строка после последней записи обрабатывается как завершающее пустое поле -, этот кладж удаляет его

Если вы хотите, чтобы :сохранялось как часть первого значения поля, измените $1=xна $1=x.":"в предложении put.

Тестирование:

$ ~/src/miller/c/mlr --idkvp --irs '\n\n' --ifs '\n' --ips ':' --ocsvlite --headerless-csv-output \
>   clean-whitespace then put 'x=$[[1]]; $[[1]]="1"; $1=x' then remove-empty-columns \
>   inputfile
Server1,8,24,2
Server2,16,32,5

или сохранение :в имени сервера:

$ ~/src/miller/c/mlr --idkvp --irs '\n\n' --ifs '\n' --ips ':' --ocsvlite --headerless-csv-output \
>   clean-whitespace then put 'x=$[[1]]; $[[1]]="1"; $1=x.":"' then remove-empty-columns \
>   inputfile
Server1:,8,24,2
Server2:,16,32,5

1 работает в Miller 5.6.2 -dev, но не в Miller 5.3.0

2 обратите внимание, что, хотя это выглядит так, должно быть возможно выполнить замену имени -значения без временной переменной как

 put '$[ $[[1]] ]=$[[1]]; $[[1]]="1"'

побочным эффектом этого является создание дополнительной пустой -переменной потока -с непечатаемым именем -.

0
28.01.2020, 02:29

Использование awk в режиме абзаца:

awk -v RS= 'gsub(/\n[^:]+: */, ",")' file

 Server1:,8,24,2
 Server2:,16,32,5
0
28.01.2020, 02:29

команда

for i in `sed -n '/server/Ip' filename `; do sed -n '/'$i'/{n;p;n;p;n;p}' filename| sed '1i '$i'';echo " "| sed "s/.*/&\n/g"; done


output


Server1:
CPU(S):  8  
RAM: 24  
Socket: 2  


Server2:
CPU(S):  16   
RAM: 32   
Socket: 5 
-1
28.01.2020, 02:29
$ awk -v RS= -v OFS=',' '{print $1, $3, $5, $7}' file
Server1:,8,24,2
Server2:,16,32,5
1
28.01.2020, 02:29

Теги

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