Умножьте определенные столбцы в CSV-файлах - PullRequest
0 голосов
/ 21 марта 2019

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

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

следует умножить на -1.

Я хочу перевернуть знак номеров этих столбцов и сделать все + к - и наоборот. Файл должен быть сохранен. Возможно ли это с помощью сценария оболочки в Linux? Может быть с awk или пандами или чем-то подобным?

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

-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="\n\n")

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

#print(df)

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

Ответы [ 3 ]

3 голосов
/ 21 марта 2019

Использовать 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), а затем выполнить математические вычисления.

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

3 голосов
/ 21 марта 2019

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

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
0 голосов
/ 21 марта 2019

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

echo "-2,-4,-5, 8, 5, 7" | sed -r 's/ //g;s/(^|,)/& -/g;s/--//g;s/^ //'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...