Или с перлом:
perl -pe 's/(\d),(\d)/$1$2/g' infile.txt
который просто удаляет все запятые, окруженные цифрами (\d ).
Я предположил, что удаление разделителей тысяч было сутью в вашей задаче -а не в какой колонке стоят запятые.
awk '
NF==1 { printf "%s%s", NR==1 ? "" : ORS, $1 }
NF==2 { printf ",%s", $2 }
END { printf "%s", ORS }
' file
# 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
Если вы хотите избавиться от пробела в начале или добавить пустую строку в конце, есть несколько способов сделать это, что немного усложнит этот скрипт. Дайте мне знать, если вы не можете понять, как это сделать.
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
$
С достаточно свежей 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"'
побочным эффектом этого является создание дополнительной пустой -переменной потока -с непечатаемым именем -.
Использование awk в режиме абзаца:
awk -v RS= 'gsub(/\n[^:]+: */, ",")' file
Server1:,8,24,2
Server2:,16,32,5
команда
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
$ awk -v RS= -v OFS=',' '{print $1, $3, $5, $7}' file
Server1:,8,24,2
Server2:,16,32,5