Перестроить файл csv

Вам необходимо добавить путь библиотеки PT7 к вашим переменным среды, как показано ниже:

export LD_LIBRARY_PATH:/opt/pt/lib

или

добавьте следующую строку в / etc / ld.so.conf.d / 10-local.conf :

/opt/pt/lib
1
07.02.2017, 17:23
2 ответа

Вы думаете в правильном направлении:

Я пытаюсь создать условие (если столбцы 2 и 3 пусты, сделайте что-нибудь)

В частности,

  • если столбцы 2 и 3 пусты, сохраните значение столбца 1 и продолжите
  • в противном случае добавьте сохраненное значение в строку и распечатайте его (есть несколько awk способов сделать это)

Так, например,

awk -F, '$2=="" && $3=="" {pfx=$1; next} {print pfx "," $0}' file.csv

или более идиоматически с использованием переменной разделителя полей FS

awk -F, '$2=="" && $3=="" {pfx=$1; next} {$0 = pfx FS $0; print}' file.csv

или (поскольку действие по умолчанию - когда правило оценивается как истина или 1 - это распечатать запись)

awk -F, '$2=="" && $3=="" {pfx=$1; next} {$0 = pfx FS $0} 1' file.csv
John,bim,bam,boom
John,tim,tam,toom
John,lam,loom,lim
Mary,pam,pim,poom
Mary,dam,dim,doom
5
27.01.2020, 23:13

Альтернатива Perl:

$ perl -F',' -lane 'if(@F == 1){$prefix = sprintf("%s,",@F);next;};print $prefix . $_' input.csv
John,bim,bam,boom
John,tim,tam,toom
John,lam,loom,lim
Mary,pam,pim,poom
Mary,dam,dim,doom

Это работает при условии, что каждая строка разделена на массив элементов с использованием , в качестве оператора и если в этом массиве только один элемент, мы используем эту строку как префикс и переходим к следующей строке. К другим строкам, длина которых превышает 1 элемент, будет добавлен префикс. Естественно, префикс изменяется тогда и только тогда, когда массив имеет длину 1.

Или короче, используя shift , как предложил Гленн Джекман: ​​

$ perl -F',' -lane 'if(@F == 1){$prefix = shift @F;next;};print $prefix . "," . $_' input.csv       

или

$ perl -F, -lane '$,=","; if (1 == @F) {$name = shift @F} else {print $name, @F}' input.csv
2
27.01.2020, 23:13

Теги

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