Если столбцы разделены табуляцией (похоже, что они это делают), то это должно работать:
$awk -F "[\t]*" '{print $1", "$2", "$3", "$4", "}' b.txt
smmsp, Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT, n, Account expires : never,
Если столбцы разделены не табуляциями, а пробелами , то использование пробела в качестве разделителя немного сбивает с толку, поскольку пробел существует даже между данными.
Я бы прочитал файл и сохранил его в таком массиве:
$while IFS=" " read -a line;do for i in {0,11,12,16};do line[$i]+=",";done;echo "${line[@]}";done <b.txt
smmsp, Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT, n, Account expires : never,
smmsp, Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT, n, Account expires : never,
smmsp, Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT, n, Account expires : never,
smmsp, Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT, n, Account expires : never,
smmsp, Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT, n, Account expires : never,
Я заметил, что с точки зрения разделения пробелов мне нужно добавить запятую в элементы массива: строка [0], строка [11], строка [ 12] и строка [16].
Этот трюк требует, чтобы все строки имели одинаковый формат.
Если нет, вам нужно прочитать каждый элемент массива и вставить запятую в нужное место.
Если у вас много строк и вы заботитесь о производительности, вы можете создать сценарий awk для обработки всех переменных (от $ 1 до $ NF) аналогичным образом, но внутри сценария awk (я плохо разбираюсь в awk ..)
sed -e:, -e's/^[^,]\{0,6\},/ &/;t,'
Он просто делает небольшой цикл, пока в начале строки не будет по крайней мере 7 незапятых. Однако он вообще ничего не делает, только если там уже есть менее 7 не-запятых, за которыми сразу следует запятая. Поэтому он не влияет на пустые строки или строки, в которых нет запятой, или те, в которых она есть, но уже начинается с 7 или более не-запятых.
Цикл также очень дешев - автомату нужно учитывать только два типа символов - те, которые являются или не являются запятыми - и только 7 из них максимум в любой момент времени.
7241,11111111111111111111111111111111,\01-data\file1
1237241,22222222222222222222222222222222,\01-data\file2
41,33333333333333333333333333333333,\01-data\file3
С awk
:
awk -v l="$(wc -L <file)" '{printf "%"l"s\n", $0}' file
-v
присваивает внешнее значение переменной awk
l
.
wc -L найти длину самой длинной строки в файле.
printf "%"l "s\n", $0
печатает каждый пробел строки, заполненный l
пробелами. Для 10 пробелов это будет выглядеть, например, так: printf "%10s\n", $0
. The output:
7241,11111111111111111111111111111111,\01-data\file1
1237241,22222222222222222222222222222222,\01-data\file2
41,33333333333333333333333333333333,\01-data\file3
Без использования sed
. Я скопировал ваш ввод и вставил его в Libreofffice Calc, выбрал опцию «разделить запятыми» в «Специальная вставка» и поместил каждый тип данных в отдельные столбцы, как показано ниже.
Думаю, очень простое решение.
7241 11111111111111100000000000000000 \01-data\file1
1237241 22222222222222200000000000000000 \01-data\file2
41 33333333333333300000000000000000 \01-data\file3