0

In bash, how can I switch 2 columns (2nd column switch as the last column) in csv, with quotation marks, divided by ,?

Input file

...

232948,55,Titulka,"Vnitřní štuk, jemný 25 kg",https://eshop.unihobby.cz/stavba-stavebni-materialy-sparovaci-hmoty-a-stuky-stuk-vnitrni-jemny-25kg/142812p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/232948.jpg
232948,55,Titulka,Vnitřní štuk jemný 25 kg,https://eshop.unihobby.cz/stavba-stavebni-materialy-sparovaci-hmoty-a-stuky-stuk-vnitrni-jemny-25kg/142812p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/232948.jpg
232948,79,Titulka,Vnitřní štuk jemný 25 kg,https://eshop.unihobby.cz/stavba-stavebni-materialy-sparovaci-hmoty-a-stuky-stuk-vnitrni-jemny-25kg/142812p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/232948.jpg
232948,79,Titulka,Vnitřní štuk jemný 25 kg,https://eshop.unihobby.cz/stavba-stavebni-materialy-sparovaci-hmoty-a-stuky-stuk-vnitrni-jemny-25kg/142812p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/232948.jpg

...

Expected output

...

232948,Titulka,"Vnitřní štuk, jemný 25 kg",https://eshop.unihobby.cz/stavba-stavebni-materialy-sparovaci-hmoty-a-stuky-stuk-vnitrni-jemny-25kg/142812p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/232948.jpg,55
232948,Titulka,Vnitřní štuk jemný 25 kg,https://eshop.unihobby.cz/stavba-stavebni-materialy-sparovaci-hmoty-a-stuky-stuk-vnitrni-jemny-25kg/142812p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/232948.jpg,55
232948,Titulka,Vnitřní štuk jemný 25 kg,https://eshop.unihobby.cz/stavba-stavebni-materialy-sparovaci-hmoty-a-stuky-stuk-vnitrni-jemny-25kg/142812p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/232948.jpg,79
232948,Titulka,Vnitřní štuk jemný 25 kg,https://eshop.unihobby.cz/stavba-stavebni-materialy-sparovaci-hmoty-a-stuky-stuk-vnitrni-jemny-25kg/142812p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/232948.jpg,79

...

I tried

awk -F ',' ' { t = $2; $2 = $6; $6 = t; print; } ' OFS=',' "input-file.csv" > "output-file.csv"

It works, but for line with quotes, there is problem, it takes , inside " too.

How can I do it for array with "?

Thanks.

genderbee
  • 203
  • 2
  • 10

1 Answers1

3

To make sure awk do not mess around with comma within field, use FPAT with gnu awk

awk -v FPAT="([^,]+)|(\"[^\"]+\")" -v OFS=, '{$0=$0OFS$2;$2=f;sub(/,,/,",")}1' file
232948,Titulka,"Vnitřní štuk, jemný 25 kg",https://eshop.unihobby.cz/stavba-stavebni-materialy-sparovaci-hmoty-a-stuky-stuk-vnitrni-jemny-25kg/142812p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/232948.jpg,55
232948,Titulka,Vnitřní štuk jemný 25 kg,https://eshop.unihobby.cz/stavba-stavebni-materialy-sparovaci-hmoty-a-stuky-stuk-vnitrni-jemny-25kg/142812p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/232948.jpg,55
232948,Titulka,Vnitřní štuk jemný 25 kg,https://eshop.unihobby.cz/stavba-stavebni-materialy-sparovaci-hmoty-a-stuky-stuk-vnitrni-jemny-25kg/142812p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/232948.jpg,79
232948,Titulka,Vnitřní štuk jemný 25 kg,https://eshop.unihobby.cz/stavba-stavebni-materialy-sparovaci-hmoty-a-stuky-stuk-vnitrni-jemny-25kg/142812p/?utm_source=kupi&utm_medium=letak&utm_campaign=9_2019,https://eshop.unihobby.cz/bin/product/4/232948.jpg,79
  • FPAT="([^,]+)|(\"[^\"]+\")" this define how the field looks like, and not the Field Separators
  • $0=$0OFS$2;$2=f;sub(/,,/,",") Move second field to end and remove second field.
  • 1 just true, so do default action print line
Jotne
  • 40,548
  • 12
  • 51
  • 55
  • Thanks, maybe I ask wrong. I need "move" 2nd column to end of line as last column, behind the last column, not switch for last column. Thanks. – genderbee Sep 03 '19 at 11:16
  • Thanks. And what if I want switch for example col2 and col4? Just want to understand second parameter. Thanks. – genderbee Sep 03 '19 at 11:58
  • @genderbee To switch two column. `{f=$2;$2=$4;$4=f}` – Jotne Sep 03 '19 at 12:01