Как я могу манипулировать данными из одного столбца csv-файла с помощью скрипта Unix?


Как я могу манипулировать данными из одного столбца csv-файла с помощью скрипта Unix?

28.01.2020 06:57:56 Просмотров 37 Источник

У меня есть csv, в котором данные выглядят примерно так,

123,Jeff,NY

456,Ross,LA

789,John,OH

Я должен написать скрипт, который манипулирует только первым столбцом и изменяет числа на нужные символы, как показано ниже,

ABC,Jeff,NY

DEF,Ross,LA

GHI,John,OH

Любая помощь ценится. Спасибо.

У вопроса есть решение - Посмотреть?

Ответы - Как я могу манипулировать данными из одного столбца csv-файла с помощью скрипта Unix? / How do I manipulate Data from one column of a csv file using Unix Script?

William Pursell

28.01.2020 07:14:57

perl -F, -ane '$,=","; $F[0] =~ s/([0-9])/chr(ord("A") + $1)/eg; print @F' input
franzisk

28.01.2020 08:35:32

Простое Баш решение

#!/bin/bash


F="$1"
[ -z "$F" ] && {
        echo "Usage: $0 csv-file"
        exit 1
}

chars=( {A..Z} )
while IFS= read -r line; do
        echo "${chars[($(echo $line | cut -b1)-1)]}${chars[($(echo $line | cut -b2)-1)]}${chars[($(echo $line | cut -b3)-1)]},"$(echo $line | cut -f2- -d,)
done < "$F"

Пояснение:

Получить файл в качестве первого параметра, выйти, если он не задан

F="$1"
[ -z "$F" ] && {
        echo "Usage: $0 csv-file"
        exit 1
}

Объявить алфавитный массив

chars=( {A..Z} )

Замкните файл и для каждой строки используйте 3 цифры из csv, чтобы получить индекс массива алфавита

while IFS= read -r line; do
        echo "${chars[($(echo $line | cut -b1)-1)]}${chars[($(echo $line | cut -b2)-1)]}${chars[($(echo $line | cut -b3)-1)]},"$(echo $line | cut -f2- -d,)
done < "$F"
oliv

28.01.2020 10:47:17

Если вы хотите изменить число с 1 на 9 буквами а на I, используйте tr

Поскольку только первый столбец вашего входного файла содержит числа, будет изменен только этот столбец.

https://stackoverflow.com/questions/59952574/how-do-i-manipulate-data-from-one-column-of-a-csv-file-using-unix-script/59955995#comment106031309_59955995
Вы можете ограничить преобразование первым столбцом с помощью чего-то вроде awk '{printf "%s,", $1 | c; close c; print $2, $3}' c="tr 1-9 A-K" OFS=, FS=, input
Thyag

29.01.2020 02:46:57

Если в других столбцах есть числа и требуется заменить только первый столбец, можно попробовать создать новый преобразованный столбец (путем извлечения и замены с помощью команд tr и cut, а затем объединения с командами вставки) :

paste -d',' <(cat abc.txt | cut -d"," -f1 | tr 1-9 A-I) abc.txt

ABC,123,Jeff,NY
,
DEF,456,Ross,LA
,
GHI,789,John,OH

Теперь вы можете удалить пустые строки, которые имеют начальную запятую

paste -d',' <(cat abc.txt | cut -d"," -f1 | tr 1-9 A-I) abc.txt|grep -v "^,"

ABC,123,Jeff,NY
DEF,456,Ross,LA
GHI,789,John,OH

Наконец, вы можете выбрать только те столбцы, которые вам нужны, используя команду вырезать :

paste -d',' <(cat abc.txt | cut -d"," -f1 | tr 1-9 A-I) abc.txt|grep -v "^,"| cut -d"," -f2,3,4

123,Jeff,NY
456,Ross,LA
789,John,OH
https://stackoverflow.com/questions/59952574/how-do-i-manipulate-data-from-one-column-of-a-csv-file-using-unix-script/59958764#comment106045793_59958764
В последней команде требуется преобразовать столбец 1, а не 2: -f1,3-.
https://stackoverflow.com/questions/59952574/how-do-i-manipulate-data-from-one-column-of-a-csv-file-using-unix-script/59958764#comment106045963_59958764
В первой команде вы можете вырезать по оставшимся полям: paste -d',' <(cat abc.txt | cut -d"," -f1 | tr 1-9 A-I) <(cut -d"," -f2- <abc.txt)
Помочь в развитии проекта:
Закрыть X