我需要将特定列值(由位置标识)替换为管道分隔文件中特定行的另一个值。
样本文件:
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
- 该命令会将修改后的文件写入标准输出。您可能应该首先运行它并输出到终端,以验证它是否是您想要的。然后,如果需要,您可以运行该命令并将输出输出到第二个文件,然后将该文件移动或复制到输入文件上。