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