Умножьте определенные столбцы в файлах csv

#pandas #shell #csv #awk

#pandas #оболочка #csv #awk

Вопрос:

У меня есть несколько больших файлов csv, в которых определенные столбцы в моем случае, где 0 является первым:

 1,4,7,10,13,16,19,22,25,28,31,34,37,40,43,46,49
  

должно быть умножено на -1.

Я хочу перевернуть знак номеров этих столбцов и превратить все в — и наоборот. Затем файл следует сохранить. Возможно ли это с помощью скрипта оболочки в Linux? Может быть, с помощью awk или pandas или чего-то подобного?

Краткий пример:

 -2,-4,-5, 8, 5, 7
  

должно быть

 2, 4 ,5, -8,-5,-7
  

Редактировать: Мои усилия на данный момент заключаются в

 import pandas as pd

myfile = open("anyfile.csv")
df = pd.read_csv(myfile, header=None)

#print(df, end="nn")

df[1,4,7,10,13,16,19,22,25,28,31,34,37,40,43,46,49] *= -1

#print(df)
  

Как я могу сохранить этот результат в новый csv. Возможно ли автоматизировать это с помощью shellscript?

Комментарии:

1. На SO мы призываем всех пользователей публиковать свои усилия, которые они приложили для решения своих собственных проблем, поэтому, пожалуйста, сделайте это и сообщите нам потом.

2. Попробуйте что-то вроде этого: awk -F "," '{print $1*-1","$2*-1}' file.csv

3. Чтобы сохранить pandas df , вы можете использовать: df.to_csv('outputfile.csv')

Ответ №1:

Используйте awk:

 columns="1,4,7,10,13,16,19,22,25,28,31,34,37,40,43,46,49"

awk -v f="$columns" '
    BEGIN{ FS=OFS=","; n=split(f,cols,",") }
    { for(i=1; i<=n; i  ) $(cols[i] 1)=-1*$(cols[i] 1) }1
' file.csv 
  

Где:

  • список номеров столбцов указывается как переменная f в awk, а затем разбивается на массив, называемый cols
  • затем вы можете перебрать этот массив и найти номера столбцов по $(cols[i] 1) , а затем произвести вычисления.

Я предположил, что все столбцы являются числами и не встроены , в поля.

Комментарии:

1. for(i=1; i<=n; i ) $(cols[i] 1)=-1*$(cols[i] 1) = for (i in cols) $(cols[i] 1)*=-1

Ответ №2:

Не могли бы вы, пожалуйста, попробовать следующее. Я предполагаю, что вы хотите изменить знак для всех столбцов и хотите, чтобы ваш вывод был в формате разделителя запятой.

 awk 'BEGIN{FS=OFS=","} {for(i=1;i<=NF;i  ){$i=$i*-1}} 1'  Input_file
  

ИЛИ (согласно хорошему предложению Джеймса сэра):

 awk 'BEGIN{FS=OFS=","} {for(i=1;i<=NF;i  ){$i=-$i}}} 1'  Input_file
  

Ответ №3:

Всегда добавляйте - и удаляйте -- . Обрабатывать пробелы.

 echo "-2,-4,-5, 8, 5, 7" | sed -r 's/ //g;s/(^|,)/amp; -/g;s/--//g;s/^ //'