awk 命令不提供第 1 列和第 2 列中部分匹配的输出

awk 命令不提供第 1 列和第 2 列中部分匹配的输出

请协助执行以下脚本,该脚本匹配变量并提供输出。该脚本正在与精确的匹配第 1 列和第 2 列,但当存在部分的匹配。

cat ~/bin/MYSH

#!/bin/bash
arg="${1:?}"
awk -v arg="${arg//\\/\\\\}" '$1 == arg || $2 == arg' "$@"  inputfile

输入文件-

1111       1111RETAIL          RETAIL8888Node  
2222       2222RETAIL          RETAIL7777Node 
3333       3333AUDITTEST       AUDIT6666Node
4444       4444AUDIT           AUDIT3333Node
5555       5555SALE            SALE4444Node
6666       6666SALE            SALE2222Node
7777       7777FINANCE         FINANCE1111Node
8888      8888FINANCE          FINANCE5555Node

该脚本通过在第 1 列或第 2 列中输入精确匹配的单词进行搜索来提供输出,如下所示。

$ MYSH 6666
6666       6666SALE            SALE2222Node

$ MYSH 4444AUDIT
  4444       4444AUDIT           AUDIT3333Node

当第 2 列中有 2-3 个或任何匹配字符时,我还需要此脚本来提供输出,如下所示。

预期产出-

$ MYSH 4444AU
  4444       4444AUDIT           AUDIT3333Node

或者

 MYSH 7777FINAN
  7777       7777FINANCE         FINANCE1111Node

答案1

测试$1 == arg真的arg如果第一个字段与变量的值相同。要测试 的值是否arg可以在 中的某处找到$1,您可以使用该index()函数。此函数返回找到子字符串的位置,如果未找到则返回零:

#!/bin/sh

arg=${1:?} awk 'index($1,ENVIRON["arg"]) || index($2,ENVIRON["arg"])' inputfile

如果您希望子字符串仅在字段的开头匹配,请检查函数的返回值index()是否为 1:

#!/bin/sh

arg=${1:?} awk 'index($1,ENVIRON["arg"])==1 || index($2,ENVIRON["arg"])==1' inputfile

我还将脚本的第一个参数作为环境变量传递到awk命令中,允许我们使用它而无需将反斜杠更改为双斜杠。

可以还可以使用$1 ~ ENVIRON["arg"](或$1 ~ "^" ENVIRON["arg"]仅在开始时匹配),这将使用用户提供的值作为针对第一个字段的值的正则表达式来执行正则表达式匹配。然而,这是不合适的,除非用户知道他们正在提供一个正则表达式而不是一个字符串。

相关内容