有条件地将列项目替换为另一列的内容

有条件地将列项目替换为另一列的内容

我的 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标签信息的分支。:aline_index_file
  • 跳过处理其他行,即 line_index_file 中未提及的那些行。
  • 在第 5 个、第 6 个和第 7 个字段的末尾放置一个标记\n(因为在我们的例子中保证在模式空间中找不到换行符)。sed
  • 然后执行将第6个字段的内容放入第7个字段的操作。

相关内容