【问题标题】:Edit fields in csv files using bash使用 bash 编辑 csv 文件中的字段
【发布时间】:2025-12-21 04:30:07
【问题描述】:

我有一堆需要“清理”的 csv 文件。 具体来说,有一列包含时间戳值,但是有些行的值是“1”。 我想要做的是用最后一个有效(时间戳)值替换那些 1,即将第 i 行的值替换为第 i-1 行的值。

我提供了一个文件样本

URL192.168.2.2,420042,20/07/2015 09:40:00,168430081,168430109
URL192.168.2.2,420042,20/07/2015 09:40:00,3232236038,3232236034
URL192.168.2.2,420042,                  1,168430081,168430109
URL192.168.2.2,420042,20/07/2015 09:40:01,3232236038,3232236034

所以在本例中,1 必须替换为 20/07/2015 09:40:00。我使用awk 尝试过,但无法确定。

【问题讨论】:

    标签: bash csv awk


    【解决方案1】:

    假设其他字段中没有逗号,这样的 awk 程序应该可以工作:

    BEGIN { FS = OFS = "," }
    $3!=1 { prev = $3 }
    $3==1 { $3 = prev }
          { print }
    

    警告:这是未经测试的代码。

    第一行将字段分隔符设置为逗号,用于输入和输出。第二行保存在第三个字段中具有时间戳的每一行的时间戳。第三行将最近保存的时间戳写入第三个字段中没有时间戳的每一行。第四行将每个输入行,无论是否修改,都写入输出。

    让我知道你过得怎么样。

    【讨论】: