Добавить разделители по определенным индексам - PullRequest
0 голосов
/ 26 февраля 2019

Я хочу добавить разделитель в некоторых индексах для каждой строки файла.

У меня есть файл с данными:

10100100010000
20200200020000

И я знаю смещение каждого столбца (2, 5 и 9)

С помощью этой команды sed: sed 's/\(.\{2\}\)/&,/;s/\(.\{6\}\)/&,/;s/\(.\{11\}\)/&,/' myFile

Я получаю ожидаемый результат:

10,100,1000,10000 
20,200,2000,20000

, но с большим количеством столбцов (~200) и строки (300k) действительно медленные.

Есть ли эффективная альтернатива?

Ответы [ 4 ]

0 голосов
/ 26 февраля 2019

С GNU awk для FIELDWIDTHS:

$ awk -v FIELDWIDTHS='2 3 4 *' -v OFS=',' '{$1=$1}1' file
10,100,1000,10000
20,200,2000,20000

Вам понадобится более новая версия gawk для * в конце FIELDWIDTHS, что означает «все, что осталось», со старой версией просто выберите большойчисло как 999.

0 голосов
/ 26 февраля 2019

Изменение команды sed для добавления в нее всех разделителей за один выстрел, вероятно, повысит ее эффективность:

sed 's/^\(.\{2\}\)\(.\{3\}\)\(.\{4\}\)/\1,\2,\3,/' myFile

Или с расширенным регулярным выражением:

sed -E 's/(.{2})(.{3})(.{4})/\1,\2,\3,/' myFile

Вывод:

10,100,1000,10000
20,200,2000,20000
0 голосов
/ 26 февраля 2019

Если вы начинаете замены со спины, вы можете использовать числовой флаг для s, чтобы указать, к какому вхождению любого символа вы хотите добавить запятую:

$ sed 's/./&,/9;s/./&,/5;s/./&,/2' myFile
10,100,1000,10000
20,200,2000,20000

Вы можетенемного автоматизируйте это, построив команду с помощью оператора printf:

printf -v cmd 's/./&,/%d;' 9 5 2
sed "$cmd" myFile

или даже обернув это в небольшую функцию оболочки, чтобы нам не приходилось перечислять столбцы в обратном порядке:

gencmd() {
    local arr
    # Sort arguments in descending order
    IFS=$'\n' arr=($(sort -nr <<< "$*"))
    printf 's/./&,/%d;' "${arr[@]}"
}

sed "$(gencmd 2 5 9)" myFile
0 голосов
/ 26 февраля 2019

1-е решение: С GNU awk не могли бы вы попробовать следующее.

awk -v OFS="," '{$1=$1}1' FIELDWIDTHS="2 3 4 5"  Input_file

2-е решение: Используя sed, попробуйте следующее.

sed 's/\(..\)\(...\)\(....\)\(.....\)/\1,\2,\3,\4/' Input_file

3-е решение: awk решение с использованием substr.

awk 'BEGIN{OFS=","} {print substr($0,1,2) OFS substr($0,3,3) OFS substr($0,6,4) OFS substr($0,10,5)}' Input_file

В приведенном выше решении substr я взял 5 цифр / символов в substr($0,10,5) на случай, если вы хотите взять все символы / цифры и т. Д., Начиная с 10-й позиции, используйте substr($0,10), который будет занимать все остальные символы / цифры строки здесь

Вывод будет следующим.

10,100,1000,10000
20,200,2000,20000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...