У меня есть данные о финансовых ценах в 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
. \n
(поскольку в нашем случае гарантированно не будет найден символ новой строки в пространстве шаблонов sed
) в конце 5-го, 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
игнорировать номера строк для условия