обратный порядок в csv

У меня есть файл CSV, например:

input.csv 1,2,3,10 4,5,6 7,8,9,12,28,30 

Я хочу изменить столбцы в этом файле, что означает:

 output.csv 10,3,2,1 6,5,4 30,28,12,9,8,7 

Я знаю, как это сделать для фиксированного количества столбцов, но если количество столбцов меняется, что мне делать?

  • Scripting для разделения одной строки CSV на несколько
  • Вырезать каждую 100-ю колонку из csv
  • Выравнивание при печати серии записей
  • Надежная сегментация csv-файла, содержащего шумные данные
  • Выбор строк в файле CSV на основе значения столбца, содержащего встроенную запятую
  • Чтение столбцов из файла, затем столбец в exsisting CSV-файл
  • Как переименовать файлы с sed и csv
  • Сортировка файла CSV, но не его заголовок
  • 5 Solutions collect form web for “обратный порядок в csv”

    С perl , если поля в вашем CSV не имеют встроенных запятых, строк новой строки и т. Д .:

     perl -lpe '$_ = join ",", reverse split /,/' input.csv 

    CSV не всегда может обрабатываться простым разбиением строк, а затем запятыми, так как поля иногда могут иметь запятые или новые строки. Чтобы иметь возможность включать эти символы, поля должны быть указаны.

    Это простое решение, которое вы можете вызывать из оболочки, которая использует правильный синтаксический анализатор csv:

     ruby -e 'require "csv"; CSV.filter(&:reverse!)' < input.csv > output.csv 

    Если у вас нет рубина, это работает как с python 2, так и с 3.

     python -c $'import csv; import sys\nfor r in csv.reader(sys.stdin): r.reverse(); csv.writer(sys.stdout).writerow(r)' < input.csv > output.csv 

    Здесь он находится в нескольких строках:

     python < input.csv > output.csv -c ' import csv import sys for r in csv.reader(sys.stdin): r.reverse() csv.writer(sys.stdout).writerow(r) ' 

    Вот несколько примеров, где это будет работать, когда решения с простым разделом запятой не будут работать:

    input.csv

     1,"2,3" 

    output.csv

     "2,3",1 

    input.csv

     1," 2" 

    output.csv

     " 2",1 

    Вы можете использовать awk :

     awk 'BEGIN{ FS=OFS="," # set the field delimiter } NF{ # execute only on non empty line for(i=NF;i>1;i--) # loop through all element except the first one printf "%s", $i OFS; # print the parameter together with the comma printf "%s", $1 "\n" # print last element }' input.csv 
     perl -l -a -F, -n -e 'print join ("," , reverse @F)' input.csv 
     awk -F, '{for(i=NF;i>=1;i--)printf("%s,",$i);printf "\n"}' input.txt | sed "s/$,//" 
    Linux и Unix - лучшая ОС в мире.