LINUX.ORG.RU

Корректировка колонки в CSV файле

 


0

1

Есть CSV файл.

id,adress,userid 1,rr@ff.com,chouse 2,hh@hj.com,pcat …………….. …………….. 40,tt@hjk.com,pcat

В колонке userid есть повторения (к примеру pcat). Необходимо преобразовать повторения в колонке userid - pcat1 pcat2 ….. pcat27 Как это сделать?

Идея такая. Делаешь два прохода (цикла) по файлу. В первом проходе строишь словарь из ид_пользователя -> количество_использований. Во втором проходе смотришь, данный userid в словаре имеет количество, равное 1? Если да, пишешь строку как есть. Если нет, берешь текущее значение счетчика для данного userid, и выводишь строку, заменяя sed’ом оригинальное значение userid. Счетчики можно хранить в заранее созданном втором словаре. Баш поддерживает словари. Вместо sed можно awk использовать, если не хочется геморроиться с регулярквми, передавая awk через внешние переменные значения юзерайди и соотв. счетчика.

seiken ★★★★★
()
Последнее исправление: seiken (всего исправлений: 1)
Ответ на: комментарий от seiken

Вообще, можно и в один проход. Но главное здесь - словарь.

seiken ★★★★★
()

Сортируешь и считаешь/инкрементируешь внутри групп.

anonymous
()
Ответ на: комментарий от seiken

Создал словарь - word_num. В файле 1.csv только колонка с userid.

Теперь пытаюсь заменить sed-ом значения из 1.csv на значение с цифрой. Не понимаю как правильно написать код по уменьшению значения в словаре на единицу !!!!

while read line; do

if [[ ${word_num[$line]} -gt 0 ]] ; then

  sed -i "s|$line|$line ${word_num[$line]}|g" 1.csv
  word_num[$line]=$((${word_num[$line]})-1)
else
  echo > null
fi

done < 1.csv

AndreyDe
() автор топика

сортируешь по полю userid

Потом в один проход:

1. читаешь строку,
2. заглядываешь в следующую строку
3. если совпадают начинаешь нумеровать и объединять и повторить п2.
4. возвр. к п1
futurama ★★★★★
()
Ответ на: комментарий от AndreyDe

Проще в один проход:

!/bin/bash

in=$1

declare -A word_num

while read line; do
    if [ -z ${word_num[$line]} ]; then
        echo $line 1
        word_num[$line]=1
    else
        word_num[$line]=$(( ${word_num[$line]} + 1 ))
        echo $line ${word_num[$line]}
    fi
done < $in

К этому надо только добавить работу с конкретным полем, а не всей строкой.

seiken ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.