Переписать столбец csv в awk с учетом пустых полей

perl -0777 -e 'print join "\n", <> =~ m/Name.*?Address:\s*([\d.]+)/gms;'

Использует многострочное регулярное выражение для сопоставления "цифр и точек" после "Address:", которому непосредственно предшествует (поскольку . *? неладно) по имени

Читает это из <> , который является магическим дескриптором файла - читает либо STDIN, либо указанные файлы, например

perl -0777 -e 'print join "\n", <> =~ m/Name.*?Address:\s*([\d.]+)/gms;' somefile 

В качестве альтернативы можно установить разделитель записей на «Имя»:

perl -lne '$/="Name:"; /Address: ([\d\.]+)/ && print $1'

Из-за отсутствия g он соответствует только в первый раз в каждой «записи».

1
20.09.2019, 09:16
2 ответа

Easy done by sed

sed 's/\(\([^,]*,\)\{4\}\)\(.*\)/\1\L\3/' file.csv

если вам не нравится экранирование символов, вы можете модифицировать скрипт (для GNU sed):

sed -r 's/(([^,]*,){4})(.*)/\1\L\3/' file.csv

который находит четыре группы любых (0 включительно) символов без запятой, за которыми следует запятая, и оставляет их без изменений (\1) и меняет все в оставшейся части строки (\3) на более низкую версию.
вырезать и вставить

paste -d, <(cut -d, -f-4 file.csv) <(cut -d, -f5- file.csv | tr '[[:upper:]]' '[[:lower:]]')
1
29.04.2021, 00:25

Возможно, я неправильно понял вопрос, поэтому, пожалуйста, простите меня, если я понял. Однако кажется, что вы должны иметь возможность просто высветить любое поле больше 4 (или 40, или как вам угодно). Например:

BEGIN {
    OFS = ","
   }
{
    for (i = 4 ; i <= NF ; i++) {
        $i = tolower($i)
        }
    $1 = $1
    print
}

В конце концов, tolower (* какое-то пустое поле *) - это просто пустое поле. Есть ли причина, по которой это не сработает?

Изменить: Мой вывод:

apple,orange,banana,cherry,melon,"fruit salad",grape
"Lots of vegtables",CUCUMBER,carrot,potato,radish,beetroot
Bread,BAGEL,,,,croissant
1
29.04.2021, 00:25

Теги

Похожие вопросы