3

我有一个像这样的 TAB 分隔文件:

示例.rpt:

54 67 common/bin/my/home {{bla bla bla}} {bla bla} ReplaceMe

89 75 bad/rainy/day/out {{ some bla} } {some bla} DontreplaceMe

我希望对第 3 项进行正则表达式匹配,例如common/bin/my/home ,如果有匹配项,我想Replace Me用我自己的文本替换第 6 项,例如happy Home

另外我的正则表达式将是一个shell变量,所以我需要一个接受正则表达式作为变量的命令

这些项目可能有空格或反斜杠,并且文件是制表符分隔的。

为了实现这一点,我使用了以下 awk one-liner:

下面我正在检查字段 3 是否与 drv 指定的模式匹配,然后执行大括号 {} 中的任何内容

awk -F "\t" -v drv=$mod_pat '$3 ~ drv \
  { OFS= "\t"; $6 = " happy_home"; print;}' sample.rpt

现在的问题是如果模式不匹配,我只想打印未触及的行。这可能在同一个命令中吗?

我试过了:

awk -F "\t" -v drv=$mod_pat \
  'if ($3 ~ drv) { OFS= "\t"; $6 = " happy_home"; print;} else {print;}' sample.rpt

但它抛出解析错误。可能是 awk 语法有问题。

4

2 回答 2

3

1是具有默认操作的模式 {print $0}
http://www.gnu.org/software/gawk/manual/html_node/Very-Simple.html

awk -F\t -v OFS=\t -v drv="home" '$3~drv{$6=" happy_home"} 1' sample.rpt 
于 2012-07-26T15:50:30.827 回答
1

如果要使用“ ”语句,则需要{}围绕程序。例如:awkif

awk -F "\t" -v drv=$mod_pat '{ if ($3 ~ drv) { OFS= "\t"; $6 = " happy_home"; print;} else {print;} }' sample.rpt
于 2012-07-26T15:45:38.063 回答