我的 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 来做到这一点?
答案1
你可以试试这个 awk
awk 'BEGIN{FS=OFS=","}NR==FNR{a[$0];next}FNR in a {$7=$6}1' line_index_file file.csv
答案2
尝试这个
for i in `cat line_index_file`
do
echo -e "`awk -v b=$i -F ',' 'BEGIN{OFS = ","} NR!=b{$7=$6};{print $0}' file.csv`" > file.csv
done
NR!=b
忽略条件的行号
答案3
您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
解释:
- 首先创建一个 shell 变量 ,保存中提到的行的
cmds
标签信息的分支。:a
line_index_file
- 跳过处理其他行,即 line_index_file 中未提及的那些行。
- 在第 5 个、第 6 个和第 7 个字段的末尾放置一个标记
\n
(因为在我们的例子中保证在模式空间中找不到换行符)。sed
- 然后执行将第6个字段的内容放入第7个字段的操作。