Сравните 2 кол. когда 1-й столбец> 2-й столбец, удалите 2-й столбец

Как сравнить 2 столбца в csv-файле, разделенных на ,, и столбцы содержат кавычки ", когда , присутствует в сгенерированном столбце, а когда 2-й столбец> 1-й столбец, то удалите 2-й (последний) кол.

Я сделал что-то похожее, сравнил 2 столбца и, когда они равны, убрал 2-й (последний) столбец.

awk ' BEGIN{FS=OFS=","} $NF==$(NF-1){$NF=""}1 ' input_file.csv | sed 's/,$//'

Файл input_file.csv.

5,464205,Obal na zahradní topidlo ETNA,https://eshop.unihobby.cz/zahrada-zahradni-nabytek-zahradni-topidla-obal-na-zahradni-topidlo-etna/149210p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/464205.jpg,559,559
5,464207,Obal na zahradní topidlo PYRAMIDA,https://eshop.unihobby.cz/zahrada-zahradni-nabytek-zahradni-topidla-obal-na-zahradni-topidlo-pyramida/149170p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/464207.jpg,559,559
2,464548,Elektrický provzdušňovač combi 3 v 1 Scheppach SC 36,https://eshop.unihobby.cz/zahrada-zahradni-technika-sekacky-elektricke-sekacky-elektricky-provzdusnovac-combi-3-v-1-scheppach-sc-36/153943p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/464548-sc36-scheppach-diy-garten-ha-kopie.jpg,2790,2790
8,465435,Plechový talíř - Autumn,https://eshop.unihobby.cz/bydleni-domacnost-interierove-dekorace-ostatni-dekorace-talir-plechovy-autumn/154256p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/465435.jpg,69,39
8,466378,Proutěný věnec 30 cm - šedá,https://eshop.unihobby.cz/bydleni-domacnost-interierove-dekorace-ostatni-dekorace-kruh-prouti-30cm-7-5cm-seda/154288p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/466378-kruh-prouti-30cm7-5cm-seda.png,149,159

Требуемый вывод, работающий с двумя последними столбцами, разделенными на , (просто в последней строке 2-е значение> 1-е значение, 149 < 159, поэтому оставьте его, иначе удалите последний столбец).

5,464205,Obal na zahradní topidlo ETNA,https://eshop.unihobby.cz/zahrada-zahradni-nabytek-zahradni-topidla-obal-na-zahradni-topidlo-etna/149210p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/464205.jpg,559
5,464207,Obal na zahradní topidlo PYRAMIDA,https://eshop.unihobby.cz/zahrada-zahradni-nabytek-zahradni-topidla-obal-na-zahradni-topidlo-pyramida/149170p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/464207.jpg,559
2,464548,Elektrický provzdušňovač combi 3 v 1 Scheppach SC 36,https://eshop.unihobby.cz/zahrada-zahradni-technika-sekacky-elektricke-sekacky-elektricky-provzdusnovac-combi-3-v-1-scheppach-sc-36/153943p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/464548-sc36-scheppach-diy-garten-ha-kopie.jpg,2790
8,465435,Plechový talíř - Autumn,https://eshop.unihobby.cz/bydleni-domacnost-interierove-dekorace-ostatni-dekorace-talir-plechovy-autumn/154256p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/465435.jpg,69
8,466378,Proutěný věnec 30 cm - šedá,https://eshop.unihobby.cz/bydleni-domacnost-interierove-dekorace-ostatni-dekorace-kruh-prouti-30cm-7-5cm-seda/154288p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/466378-kruh-prouti-30cm7-5cm-seda.png,149,159

Можно ли сделать это не только для последнего столбца, а для столбца внутри где-нибудь в строке (удалить)?

И как я могу это сделать, если в csv нет кавычек " а вот | например?

0
задан 3 October 2019 в 08:53

2 ответа

Используя Miller ( https://github.com/johnkerl/miller), запускающийся от

5,464205,Obal na zahradní topidlo ETNA,https://eshop.unihobby.cz/zahrada-zahradni-nabytek-zahradni-topidla-obal-na-zahradni-topidlo-etna/149210p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/464205.jpg,559,559
5,464207,Obal na zahradní topidlo PYRAMIDA,https://eshop.unihobby.cz/zahrada-zahradni-nabytek-zahradni-topidla-obal-na-zahradni-topidlo-pyramida/149170p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/464207.jpg,559,559
2,464548,Elektrický provzdušňovač combi 3 v 1 Scheppach SC 36,https://eshop.unihobby.cz/zahrada-zahradni-technika-sekacky-elektricke-sekacky-elektricky-provzdusnovac-combi-3-v-1-scheppach-sc-36/153943p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/464548-sc36-scheppach-diy-garten-ha-kopie.jpg,2790,2790
8,465435,"Plechový, talíř - Autumn",https://eshop.unihobby.cz/bydleni-domacnost-interierove-dekorace-ostatni-dekorace-talir-plechovy-autumn/154256p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/465435.jpg,69,39
8,466378,Proutěný věnec 30 cm - šedá,https://eshop.unihobby.cz/bydleni-domacnost-interierove-dekorace-ostatni-dekorace-kruh-prouti-30cm-7-5cm-seda/154288p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/466378-kruh-prouti-30cm7-5cm-seda.png,149,159

и работающий

mlr --csv --implicit-csv-header --headerless-csv-output  put 'if ($6 >= $7) {unset $7 }' input.csv | sed -r '/^\s*$/d' >output.txt

Вы будете иметь

5,464205,Obal na zahradní topidlo ETNA,https://eshop.unihobby.cz/zahrada-zahradni-nabytek-zahradni-topidla-obal-na-zahradni-topidlo-etna/149210p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/464205.jpg,559
5,464207,Obal na zahradní topidlo PYRAMIDA,https://eshop.unihobby.cz/zahrada-zahradni-nabytek-zahradni-topidla-obal-na-zahradni-topidlo-pyramida/149170p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/464207.jpg,559
2,464548,Elektrický provzdušňovač combi 3 v 1 Scheppach SC 36,https://eshop.unihobby.cz/zahrada-zahradni-technika-sekacky-elektricke-sekacky-elektricky-provzdusnovac-combi-3-v-1-scheppach-sc-36/153943p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/464548-sc36-scheppach-diy-garten-ha-kopie.jpg,2790
8,465435,"Plechový, talíř - Autumn",https://eshop.unihobby.cz/bydleni-domacnost-interierove-dekorace-ostatni-dekorace-talir-plechovy-autumn/154256p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/465435.jpg,69
8,466378,Proutěný věnec 30 cm - šedá,https://eshop.unihobby.cz/bydleni-domacnost-interierove-dekorace-ostatni-dekorace-kruh-prouti-30cm-7-5cm-seda/154288p/?utm_source=email&utm_medium=Katalog&utm_campaign=Osvetleni_2019,https://eshop.unihobby.cz/bin/product/4/466378-kruh-prouti-30cm7-5cm-seda.png,149,159

, Если Ваш разделитель полей будет |, то команда будет

mlr --csv --fs "|" --implicit-csv-header --headerless-csv-output  put 'if ($6 >= $7) {unset $7 }' input.csv | sed -r '/^\s*$/d' >output.txt

, Если Вы захотите сравнить не столбцы 6 и 7, можно изменить команду с помощью номера столбца, который Вы хотите сравнить.

1
ответ дан 23 October 2019 в 09:37

Если Ваш файл может содержать заключенные в кавычки встроенные разделители, то что-либо на основе стандартных инструментов как sed или awk будет хрупким - лучше для пользований специализированной библиотекой парсинга CSV.

Одна опция является perl's текст:: модуль CSV . Например, учитывая [1 114]

$ cat file.csv
foo,bar,baz,559,559
foo,field with spaces,baz,559,559
foo,"field with embedded, quoted separators",baz,2790,2790
foo,bar,baz,69,39
foo,bar,baz,149,159

затем

$ perl -MText::CSV -lne '
  BEGIN{$p = Text::CSV->new()}
  @f = $p->fields() if $p->parse(

Если Ваш файл может содержать заключенные в кавычки встроенные разделители, то что-либо на основе стандартных инструментов как sed или awk будет хрупким - лучше для пользований специализированной библиотекой парсинга CSV.

Одна опция является perl's текст:: модуль CSV . Например, учитывая [1 114] [110]

затем

[111]

Примечание, что по умолчанию, print метод заключает в кавычки поля, которые содержат пробел, а также тех, которые содержат символ разделителя - можно настроить это во время инстанцирования установкой quote_space напр.:

  BEGIN{$p = Text::CSV->new({quote_space => 0})}

Для создания жемчуга unicode-знающим, необходимо будет, вероятно, добавить -CSDL. Можно легко изменить его для сравнения других столбцов напр. splice @f,4 if $f[4] <= $f[3] (помнящий, что в жемчуге массивы индексируются нулем).

<час>

у меня есть чувство, что должно быть намного более просто сделать использование мельник условно put луг unset $[NF] однако, я не мог заставить его работать совершенно верно.

) or die "Failed to parse CSV"; $n = $#f; splice @f,-1 if $f[$n] <= $f[$n-1]; $p->print(*STDOUT,\@f) ' file.csv foo,bar,baz,559 foo,"field with spaces",baz,559 foo,"field with embedded, quoted separators",baz,2790 foo,bar,baz,69 foo,bar,baz,149,159

Примечание, что по умолчанию, print метод заключает в кавычки поля, которые содержат пробел, а также тех, которые содержат символ разделителя - можно настроить это во время инстанцирования установкой quote_space напр.:

  BEGIN{$p = Text::CSV->new({quote_space => 0})}

Для создания жемчуга unicode-знающим, необходимо будет, вероятно, добавить -CSDL. Можно легко изменить его для сравнения других столбцов напр. splice @f,4 if $f[4] <= $f[3] (помнящий, что в жемчуге массивы индексируются нулем).

<час>

у меня есть чувство, что должно быть намного более просто сделать использование мельник условно put луг unset $[NF] однако, я не мог заставить его работать совершенно верно.

0
ответ дан 23 October 2019 в 09:37

Другие вопросы по тегам:

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