使用 shell 脚本将正则表达式应用于 TSV 格式的单列

sed*_*idw 2 regex shell awk

我有一个 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)

anu*_*ava 5

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)