我如何在 awk 匹配中传递变量?

我如何在 awk 匹配中传递变量?

我有一个 awk 命令。我需要使用i变量,但是当我这样做时我的命令不起作用。

“fechaName”:“1”,“firstName”:“gdrgo”,“xxxxx”:“约翰”,“xxxxx”:“约翰”,“xxxxx”:“约翰”,“xxxxx”:“约翰”,“xxxxx” “:“约翰”,“姓氏”:“222”,dfg
“fechaName”:“2”,“xxxxx”:“约翰”,“名字”:“贝托”,“xxxxx”:“约翰”,“xxxxx”:“约翰”,“xxxxx”:“约翰”,“姓氏” ": "111","xxxxx": "约翰",
“fechaName”:“4”,“xxxxx”:“约翰”,“名字”:“贝托”,“xxxxx”:“约翰”,“xxxxx”:“约翰”,“xxxxx”:“约翰”,“姓氏” ": "111","xxxxx": "约翰",
“fechaName”:“4”,“xxxxx”:“约翰”,“xxxxx”:“约翰”,“名字”:“beto2”,“xxxxx”:“约翰”,“姓氏”:“555”,“xxxxx” ": "约翰","xxxxx": "约翰",
“fechaName”:“5”,“xxxxx”:“约翰”,“xxxxx”:“约翰”,“名字”:“beto2”,“xxxxx”:“约翰”,“姓氏”:“444”,“xxxxx” ": "约翰","xxxxx": "约翰",
“fechaName”:“4”,“firstName”:“gdrgo”,“xxxxx”:“约翰”,“xxxxx”:“约翰”,“xxxxx”:“约翰”,“xxxxx”:“约翰”,“xxxxx” “:“约翰”,“姓氏”:“222”,dfg
“fechaName”:“7”,“xxxxx”:“约翰”,“xxxxx”:“约翰”,“名字”:“beto2”,“xxxxx”:“约翰”,“姓氏”:“444”,“xxxxx” ": "约翰","xxxxx": "约翰",

当我用 5 代替“我”有用

awk  -v OFS='"' -v   FS='Name": "'     '{ for( i=2; i<=7; i++ ) if( match($2, /5"/) )  print $0 }'   sumacomando

这是我的命令

awk  -v OFS='"' -v   FS='Name": "'     '{ for( i=2; i<=7; i++ ) if( match($2, /**i**"/) )  print $0 }'   sumacomando

awk  -v OFS='"' -v   FS='Name": "'     '{ for( i=2; i<=7; i++ ) if( match($2, /i"/) )  print $0 }'   sumacomando

答案1

您无法仅通过一次对所有记录进行排序。

要从字面上回答您的主要问题,将字段与变量相匹配,您只需要不做match($2,i)/.../或者match($2, i "\"")后面i跟着". 使用正常的字符串连接语法)。

即使这个也会为您带来包含“4”的记录的正确结果:

awk '{i=4}$0 ~ "\"" i "\""' file1 #(string concatenation yelds to "4")

但是这个虽然可以正常工作,但不会像您所期望的那样自动一次对数据进行排序:

awk '{for (i=1;i<8;i++) if ($0 ~ "\"" i "\"") print}' file1

要对所有记录进行排序,您需要首先将所有记录加载到内存中,然后按排序顺序打印它们。

这是适用于示例文件的不同方法:

awk  -F"[\"]" '{a[$4]?a[$4]=a[$4] ORS $0:a[$4]=$0;last=NR}END{for (i=1;i<=last;i++) if (a[i]) print a[i]}' file1

请参阅此处的在线测试

使用 " 第一行的分隔符文本"fechaName": "1",....将分为 4 部分,并且1(字段 $4)可以直接用作整数。

这部分a[$4]?a[$4]=a[$4] ORS $0:a[$4]=$0只是一个 if-then-else:

if a[$4](==>a[1]对于第一行) 已经有一个值,则使用输出记录分隔符 (ORS) 将此行添加到前面的 a[$4] 内容中,这是一个新行(或者可能是一个简短的“\n”) -否则只需将 $0 应用于 a[$4]

最后在结束部分我们只打印这个数组 a。

我们需要在这里说,对于此操作,排序将比 awk 快得多:

LC_ALL=C sort -t"\"" -k3 file1

答案2

看来你想打印包含 1 到 7 的行。那会是这样的

awk '/"fechaName": "[1-7]"/ { print }'

相关内容