【问题标题】:search and replace a csv file搜索和替换 csv 文件
【发布时间】:2022-01-07 21:21:21
【问题描述】:

我一直在处理一个 csv 文件。

我只想替换第 3 列和第 4 列。

这是一个例子:

Col1  Col2  Col3              Col4             Col5   Col6               Col7
c1    f2    stack.overflow    stack.overflow   f5     stack.overflow     stack.overflow
d1    g2    stack2.overflow2  stack2.overflow2 xyx    stack2.overflow2   stack2.overflow2

我只执行 Col3 和 Col4 的搜索和替换。

我得到的是:

Col1  Col2  Col3              Col4             Col5   Col6               Col7
c1    f2    macy.greytold     macy.greytold    f5     stack.overflow     stack.overflow
d1    g2    prince.caballero  prince.caballero xyx    stack2.overflow2   stack2.overflow2

我用过 sed:

 sed ' s!stack.overflow2!prince.caballero!g' filename.csv > test1.csv
 sed ' s!stack.overflow!macy.greytold!g' test1.csv > test-2.csv

但这改变了一切。有没有办法只更改字段 3 和 4?

请注意,我给出了 2 行的示例。这可以运行到 100 行。

【问题讨论】:

  • 你应该看看 awk。它可以与指定的列一起使用并对其进行替换。我不记得确切的语法
  • 您能否确认您的值之间是否可以有空格,例如:stack overflow
  • 您说您的输入是 CSV,但您提供的示例输入/输出不是 CSV。请edit您的问题是将文件描述从 CSV 更改为任何内容(制表符分隔?固定宽度字段?其他?),或者将您的示例更改为 CSV。
  • @RavinderSingh13 它们之间不是空格。
  • @EdMorton 这是一个 CSV 文件,用逗号分隔。只是为了更容易查看,我像示例一样给出了它。

标签: bash awk sed replace


【解决方案1】:

假设您的文件是 TSV 文件(制表符分隔值),这很容易使用 Awk。

awk -F '\t' '$3 == "stack.overflow2" { $3 = "prince.caballero" }
    $4 == "stack.overflow2" { $4 = "prince.caballero" }
    $3 == "stack.overflow" { $3 = "macy.greytold" }
    $4 == "stack.overflow" { $4 = "macy.greytold" }
    1' filename.csv >updated.tsv

Awk 一次处理一行(或更一般地说,一条记录;您可以使用RS=value 更改记录分隔符)。变量$1$2 等获取行上各个字段的值。 == 比较只是检查逐字是否相等(如果您想匹配这些字段的子字符串,或者例如不区分大小写的匹配,请更新问题),最后的 1 表示打印每一行。

在一般情况下,CSV 及其变体允许引用字段,这意味着并非所有记录都是单行,并且并非所有字段分隔符实际上都分隔两个字段,此时使用简单的面向行的工具(如 Awk)可能不会不再可行。如果您遇到这些复杂情况,请寻找专用的 CSV 处理工具,或切换到带有适当 CSV 解析器的语言——Python 是一种流行的选择。

【讨论】:

  • 但是文件名很长而且我们不知道名字是什么。
  • 我看不出这与您提出的问题或我提供的答案有什么关系。如果您在不相关的问题上需要帮助,(接受您得到的答案之一,或发布您自己的答案并接受,如果您愿意,并且)提出一个新问题。
【解决方案2】:

您使用全局g 标志,这意味着替换所有匹配项。您可以通过将出现sed ' s!stack.overflow2!prince.caballero!2' 定位为第二个等来过滤它。

你也可以简单地为每场比赛做两次替换。

使用sed

$ sed 's/stack.overflow/macy.greytold/;s/stack.overflow/macy.greytold/;s/stack2.overflow2/prince.caballero/;s/stack2.overflow2/prince.caballero/' input_file 
Col1  Col2  Col3              Col4             Col5   Col6               Col7
c1    f2    macy.greytold    macy.greytold   f5     stack.overflow     stack.overflow
d1    g2    prince.caballero  prince.caballero xyx    stack2.overflow2   stack2.overflow2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 2017-09-08
    • 2014-03-24
    • 2014-03-22
    • 2015-06-29
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    相关资源
    最近更新 更多