我有一个 TSV 文件,我想将其传输到脚本中并仅修改一列(就地)并保持其余数据不变。
示例行:
column1 column2 1 2 3
Run Code Online (Sandbox Code Playgroud)
例如,我想将正则表达式应用于column2(但将其保留在适当的位置)
更新我认为我在原来的帖子中没有说得很清楚,我实际上想在同一列上进行两次替换
我的一个非常简单的尝试是
while read line; do
echo $line | cut -f2 | sed 's/col/something_else/g' | sed 's/mn//g'
done
Run Code Online (Sandbox Code Playgroud)
这会修改我想要的列。但我无法从原始行重新创建其余数据。我很好用awk(虽然我不太熟悉它)。真正的要求是在 shell 命令中运行它(在 Linux 上)
期望的输出是
column1 something_else2 1 2 3
Run Code Online (Sandbox Code Playgroud)
gnu awk支持就地编辑,因此您只需使用此命令并将更改保存回文件:
awk -i inplace 'BEGIN{FS=OFS="\t"} {
sub(/col/, "something_else", $2); sub(/mn/, "", $2)} 1' file
Run Code Online (Sandbox Code Playgroud)
以下是awk命令详细信息:
-i inplace启用就地编辑gnu awk-F '\t':使用制表符作为输入字段分隔符$n表示记录中的第 n 列,因此$2变为第 2 列1默认操作是awk打印完整记录如果您不使用,gnu awk则使用:
awk 'BEGIN{FS=OFS="\t"} {
sub(/col/, "something_else", $2); sub(/mn/, "", $2)} 1' file>file.tmp && mv file.tmp file
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用sed就地编辑:
sed -i.bak -E $'s/^([^\t]+\t)col/\\1something_else/' file
Run Code Online (Sandbox Code Playgroud)