Условно заменить элементы столбца содержимым другого столбца.

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

2012-06-06 18:00:00,2012-06-06 19:00:00,4,2012-06-06 14:00:00,4,1644.8005,1644.8,1631.232,1632.266,7353,TRUE 

и я хотел бы условно заменить в этом конкретном примере содержимое столбца 7 содержимым столбца 6 так, чтобы столбцы 6 и 7 содержали одинаковое значение.

Номера строк файла, по которым должны быть выполнены такие условные операции, должны читаться из отдельного текстового файла (назовем его «line_index_file», который выводится из другой программы, Octave), и это выглядит, например, так:

 100 125 

Это означает, что вышеуказанные операции должны применяться только к строкам 100 и 125 исходного файла данных.

Как бы я это сделал с помощью sed или awk?

Вы можете попробовать это awk

 awk 'BEGIN{FS=OFS=","}NR==FNR{a[$0];next}FNR in a {$7=$6}1' line_index_file file.csv 

Вы можете использовать редактор sed для выполнения этой задачи:

 cmds=$(< line_index_file xargs -l printf '\t%sba\n') sed -e " ${cmds} ;# skip these b :a s/,/\n/5;s//\n/5;s//\n/5 s/\n\(.*\)\n.*\n/,\1,\1,/ " input.csv 

Объяснение:

  • Сначала создайте переменную оболочки, cmds , удерживая cmds к метке :a информацию для строк, упомянутых в line_index_file .
  • Пропустить обработку других строк, то есть тех строк, которые не упомянуты в line_index_file.
  • Поместите маркер \n (поскольку в нашем случае гарантированно не будет найден символ новой строки в пространстве шаблонов sed ) в конце 5-го, 6-го и 7-го полей.
  • Затем выполните операцию, чтобы поместить содержимое 6-го поля в 7-е.

Попробуй это

  for i in `cat line_index_file` do echo -e "`awk -vb=$i -F ',' 'BEGIN{OFS = ","} NR!=b{$7=$6};{print $0}' file.csv`" > file.csv done 
  • NR!=b игнорировать номера строк для условия