Bash: используйте заглавные буквы имени и фамилии в файле .csv. - PullRequest
1 голос
/ 27 мая 2020

Существует файл cc .csv, который содержит имя и фамилию в 3-м столбце ( например: john smith ). Я пытаюсь использовать первые буквы с большой буквы ( John Smith ) и создаю новый файл acc_new.csv с таким:

#!/bin/bash

while IFS=, read -r col1 col2 col3 

do
    for n in $col3; do
        n=${n^}
    done  

done < acc.csv > acc_new.csv

Но файл acc_new.csv пуст. Что не так с кодом?

a cc .csv:

id,location,name
1,1,john smith
2,2,paul Robinson
3,3,Fidel guererro
...

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

id,location,name
1,1,John Smith
2,2,Paul Robinson
3,3,Fidel Guererro
...

Ответы [ 4 ]

2 голосов
/ 27 мая 2020

Исходный код bash считывает и изменяет содержимое acc.csv, но не организовывает и не экспортирует измененное содержимое.

Измененный код может помочь:

#!/bin/bash

while IFS=, read -r col1 col2 col3 

do
    unset col3_new

    if [ "$col1" == id ]; then
        echo "${col1},${col2},${col3}"
        continue
    fi

    for n in $col3; do
        if [ -z "$col3_new" ]
        then
            col3_new=${n^}
        else
            col3_new+=" ${n^}"
        fi
    done  
    echo "${col1},${col2},${col3_new}"

done < acc.csv > acc_new.csv
1 голос
/ 27 мая 2020

Вы можете сделать это на чистом bash, как вы пытаетесь, но это, вероятно, более эффективно на другом языке.

Perl пример:

$ perl -F, -lane '$F[2] =~ s/\b([[:alpha:]])/\u$1/g if $. > 1;
                  print join(",", @F)' acc.csv > acc_new.csv
$ cat acc_new.csv
id,location,name
1,1,John Smith
2,2,Paul Robinson
3,3,Fidel Guererro

Этот заголовок буква в третьем столбце (пропуская первую строку заголовка) в разрыве слова - например, в начале поля или после пробела.

0 голосов
/ 27 мая 2020

Вот решение с использованием bash и awk

#!/bin/bash

cat acc.csv | awk '
    BEGIN {OFS=FS=","};
    NR>1{
        $3 = tolower($3);
        split($3, arr, " ");
        for(i in arr)
            sub(arr[i], toupper(substr(arr[i], 1, 1))substr(arr[i], 2), $3)
    }1' > acc_new.csv
0 голосов
/ 27 мая 2020

Если не возражаете, используйте строку perl ...

образец:

name,job,fee
aaaa,bbb,ccc

код

perl -lne 's/^./uc($&)/e  && print' < my.csv

или

perl -lne 's/^./\u$&/g  && print' < my.csv

вывод:

Name,job,fee
Aaaa,bbb,ccc

Для вашего случая, который начинается с цифр, попробуйте это

perl -lpe 's/(?<=,)[a-z]/\u$&/ ' < smple.csv

вывод

id,Location,name
1,1,John smith
2,2,Paul Robinson
3,3,Fidel guererro

и если вы хотите, чтобы затрагивались только строки, начинающиеся с цифр, первые совпадающие числа

perl -lpe '/^\d/ && s/(?<=,)[a-z]/\u$&/ ' < smple.csv

ref

...