sed编辑csv文件中的特定列和行

时间:2017-08-01 18:13:54

标签: bash csv sed

我正在开发一个项目,要求我编辑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命令,该命令将用更新的行替换现有行,但我的所有尝试都没有成功!

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

2 个答案:

答案 0 :(得分:2)

使用GNU sed:

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

<强>说明

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

要编辑文件,请添加Yes标记:

-i

答案 1 :(得分:0)

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

.html

检查第一个分隔的字段是否等于9856,然后打印前25个逗号分隔的字段,接着是&#34;是&#34;然后是字段27直到最后一个字段,但是一个。然后我们最后打印最后一个字段,最后没有逗号。