Переформатирование столбцов CSV с помощью SED (или любого другого coreutil)

Если столбцы разделены табуляцией (похоже, что они это делают), то это должно работать:

$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 ..)

6
06.01.2016, 09:40
3 ответа
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
6
27.01.2020, 20:22

С 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
8
27.01.2020, 20:22

Без использования sed . Я скопировал ваш ввод и вставил его в Libreofffice Calc, выбрал опцию «разделить запятыми» в «Специальная вставка» и поместил каждый тип данных в отдельные столбцы, как показано ниже.

Думаю, очень простое решение.

7241    11111111111111100000000000000000    \01-data\file1 

1237241 22222222222222200000000000000000    \01-data\file2

41      33333333333333300000000000000000    \01-data\file3
0
27.01.2020, 20:22

Теги

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