Как объединить первые две строки csv по столбцам?

Хорошо, давайте ответим. rsync - это инструмент командной строки для этого. Итак, вам нужно что-то вроде этого:

rsync -a /home/mydir /media/myusb/photos

см. man rsync для получения полной информации. Параметр -a дает вам подмножество наиболее часто используемых параметров - это «режим архивирования», эквивалентный -rlptgoD. Это скопировало бы содержимое / home / mydir в / media / myusb / photos, и не нужно было бы копировать какие-либо файлы, которые уже присутствовали и были идентичны в месте назначения.

4
06.08.2018, 04:48
3 ответа

Попробуйте это

$ awk -F, 'NR<2{split(gensub(/Citty/,"City","g",$0),a,FS)}NR==2{for(b=2;b<=NF;b+=2){c=c a[b]" "$b","}print gensub(/,$/,"",1,c)}NR>2{print gensub(/(^,|" *",)/,"","g",$0)}' inp
Product Name,City Location,Price Per Unit
banana,CA,5.7
apple,FL,2.3
$

Один и тот же код становится более читаемым, если он разбит на несколько строк.:

$ awk -F, '
> NR<2{split(gensub(/Citty/,"City","g",$0),a,FS)}
> NR==2{for(b=2;b<=NF;b+=2){c=c a[b]" "$b","}print gensub(/,$/,"",1,c)}
> NR>2{print gensub(/(^,|" *",)/,"","g",$0)}' inp
Product Name,City Location,Price Per Unit
banana,CA,5.7
apple,FL,2.3
$

Если 1-я строка, разбить строку на элементы массива в пределах a. Исправьте опечатку в Citty ->City.

Если 2-я строка, начиная со 2-го столбца, вывести соответствующий столбец из 1-й строки вместе с этим столбцом. Повторите для каждого столбца с шагом в 2 столбца. Зачистите шлейф ,.

После второй строки замените любой начальный ,или любой "<spaces>",пустой строкой, а затем распечатайте результат.

Проверено успешно на GNU Awk 4.0.2

Попробуйте онлайн!

5
27.01.2020, 20:47

Попробуйте

    awk -F, '
            {gsub (/,*"[    ]*",*/, ",")
             sub (/^,/, "")
             sub (/Citty/, "City")
            }

    NR == 1 {n = split ($0, T)
             next
            }
    NR == 2 {for (;n; n--) $n = T[n] " " $n
            }

    1
    ' OFS=, file
Product Name,City Location,Price Per Unit
banana,CA,5.7
apple,FL,2.3
3
27.01.2020, 20:47

Использование Perl с текстом ::CSV и другие утилиты:

perl -MText::CSV -MList::MoreUtils=pairwise -lne '
  BEGIN { $p = Text::CSV->new(); } 
  @f = $p->fields() if $p->parse($_);
  @hdr = map { s/Citty/City/ ; $_ } @f if $. == 1;
  @f = pairwise { $a. " ". $b } @hdr, @f if $. == 2;
  print join ",", grep { /\w/ } @f if $. > 1;
' file.csv
Product Name,City Location,Price Per Unit
banana,CA,5.7
apple,FL,2.3

grepопускает поля, которые не содержат хотя бы один символ слова.

С perl >= 5.14.0 вы можете упростить замену на map s/Citty/City/r @fс помощью модификатора Non -деструктивной замены .

4
27.01.2020, 20:47

Теги

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