#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/^ //'