Как мне манипулировать данными из одного столбца CSV-файла, используя Unix Script? - PullRequest
0 голосов
/ 28 января 2020

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

123,Jeff,NY

456,Ross,LA

789,John,OH

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

ABC,Jeff,NY

DEF,Ross,LA

GHI,John,OH

Любая помощь приветствуется. Спасибо.

Ответы [ 4 ]

2 голосов
/ 28 января 2020

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

tr 1-9 A-I <file

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

0 голосов
/ 29 января 2020

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

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

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

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
0 голосов
/ 28 января 2020

Простое bash решение

#!/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} )

L oop файла и для каждой строки используйте 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"
0 голосов
/ 28 января 2020
perl -F, -ane '$,=","; $F[0] =~ s/([0-9])/chr(ord("A") + $1)/eg; print @F' input
...