替换管道分隔文件中特定行的特定列上的值 - sed 还是 awk?

替换管道分隔文件中特定行的特定列上的值 - sed 还是 awk?

我需要将特定列值(由位置标识)替换为管道分隔文件中特定行的另一个值。

样本文件:

a|abc|val|sum|temp
bs|run|win|can|done
jump|over|change|value

现在,我想将第 3 列第 2 行的值替换为“已更改”。 (在上面的示例输入中,旧的、要替换的值是“win”,但它可以是任何东西,而且我不会提前知道它是什么。)

预期输出:

a|abc|val|总和|温度
废话|运行|改变了|可以|完成
跳转|越过|变化|值

答案1

在 GNU sed 中,

sed -E '2s/^(([^|]*\|){2})[^|]*/\1changed/' input
  • 第一个“2”( 2s) 标识行号。
  • 第二个“2”( {2}) 标识要跳过多少列并保留相同的列。如果您想更改第 17 个字段,您可以使用 {16}
  • 该命令会将修改后的文件写入标准输出。您可能应该首先运行它并输出到终端,以验证它是否是您想要的。然后,如果需要,您可以运行该命令并将输出输出到第二个文件,然后将该文件移动或复制到输入文件上。
  • 或者,您可以-i向 sed 添加选项以使其覆盖输入文件。

在 awk 中:

awk -F'|' -vOFS='|' 'NR==2 {$3 = "changed"} {print}' input
  • 该命令会将修改后的文件写入标准输出。您可能应该首先运行它并输出到终端,以验证它是否是您想要的。然后,如果需要,您可以运行该命令并将输出输出到第二个文件,然后将该文件移动或复制到输入文件上。

相关内容