【问题标题】:sed editing specific column and row in a csv filesed 编辑 csv 文件中的特定列和行
【发布时间】:2018-01-08 17:50:47
【问题描述】:

我正在处理一个需要我编辑 csv 文件的特定列和行的项目。我已成功找到正确的行,获取行号,甚至将特定列更新为标准输出,但不在 .csv 文件中。我遇到的问题是将它们放在一起并让 sed 更新文件中的值。

这是 csv 中的值的示例:

9847,3132,132,0,168,0,410,73,4400,DC,4300,6,248,Yes,Yes,Yes,Yes,Yes,No,No,No,No,No,LSI,Service,Yes,No,No,pw,Yes,SA
9848,132,3132,0,168,0,410,73,4400,DC,4300,6,248,Yes,Yes,Yes,Yes,Yes,No,No,No,No,No,LSI,Service,Yes,No,No,pw,Yes,SA
9849,3132,132,0,168,0,410,73,4400,DC,4300,6,248,Yes,Yes,Yes,Yes,Yes,No,No,No,No,No,LSI,Service,Yes,No,Yes,pw,Yes,SA
9850,3132,132,0,168,0,410,73,4400,DC,4300,6,248,Yes,Yes,Yes,Yes,Yes,No,No,No,No,No,LSI,Service,Yes,No,Yes,pw,Yes,SA
9851,3132,132,0,168,0,410,73,4400,DC,4300,6,248,Yes,Yes,Yes,Yes,Yes,No,No,No,No,No,LSI,Service,Yes,No,Yes,pw,Yes,SA
9852,3132,132,0,168,0,410,73,4400,DC,4300,6,248,Yes,Yes,Yes,Yes,Yes,No,No,No,No,No,LSI,Service,Yes,No,Yes,pw,Yes,SA
9853,3132,132,0,168,0,410,73,4400,DC,4300,6,248,Yes,Yes,Yes,Yes,Yes,No,No,No,No,No,LSI,Service,Yes,No,Yes,pw,Yes,SA
9854,3132,132,0,168,0,410,73,4400,DC,4300,6,248,Yes,Yes,Yes,Yes,Yes,No,No,No,No,No,LSI,Service,Yes,No,Yes,pw,Yes,SA
9855,3132,132,0,168,0,410,73,4400,DC,4300,6,248,Yes,Yes,Yes,Yes,Yes,No,No,No,No,No,LSI,Service,Yes,No,Yes,pw,Yes,SA
9856,3132,132,0,168,0,410,73,4400,DC,4300,6,248,Yes,Yes,Yes,Yes,Yes,No,No,No,No,No,LSI,Service,Yes,No,No,pw,Yes,SA
9857,3132,132,0,168,0,410,73,4400,DC,4300,6,248,Yes,Yes,Yes,Yes,Yes,No,No,No,No,No,LSI,Service,Yes,No,Yes,pw,Yes,SA

在本例中,我想将项目编号 9856 的第 28 列修改为“是”。到目前为止,我成功的命令包括:​​

这个命令给了我一个正确的返回,我希望该行如何出现。

grep 9856 ./file.csv | awk -F, '$28="Yes"' 

从这里我假设我需要将结果传递给 sed 命令,该命令将用更新的行替换现有行,但我所有的尝试都没有成功!

另外,如果您能详细说明您的答案,以供我学习。我还将在此项目中编辑许多其他列值。

【问题讨论】:

  • awk 'BEGIN{FS=OFS=","} $1=="9856" {$28="Yes"}1' file?
  • Cyrus,这个命令会更新现有的 file.csv 吗?
  • 这不会更新文件。

标签: bash csv sed


【解决方案1】:

您可以使用完整的 awk 解决方案

awk -F, '$1 == "9856" { for (i=1;i<=25,i++) { printf "%s,",$i } printf "%s,","Yes";for (i=27;i<=NF-1;i++) { printf "%s,",$i } printf "%s",$NF }' filename

检查第一个分隔字段是否等于 9856,然后打印前 25 个逗号分隔字段,后跟 ,然后是“是”,然后是字段 27,直到最后一个字段。然后我们最终打印最后一个没有逗号的字段。

【讨论】:

  • 这个 awk 命令会更新原始的 file.csv 文件吗?它似乎正在编辑字符串,但没有更新文件。
  • 您需要将输出重定向到另一个文件。
【解决方案2】:

使用 GNU sed:

sed '/^9856,/s/[^,]*/Yes/28' file.csv

说明

  • /^9856,/: 如果行以 ^9856, 开头
  • s/[^,]*/Yes/28:用Yes替换第28次出现的包含零个或多个(*)非​​逗号字符([^,]*)的字符串

要就地编辑文件,请添加-i 标志:

sed -i '/^9856,/s/[^,]*/Yes/28' file.csv

【讨论】:

  • 这正是我所需要的!您介意简要描述一下命令的语法吗?它看起来并不太复杂,但我也想从中学习。
猜你喜欢
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多