如何在AWK中为给定的数据集使用match

如何在AWK中为给定的数据集使用match,awk,Awk,我正在处理从AWK中的curl命令获得的一些结果,但尽管阅读了有关match和regexp的内容,我仍然有一些问题。我已经写了所有的东西,但是用了一种非常粗俗的方式,使用了很多substr和非常基本的匹配用法,而没有用regexp捕获任何东西 我的真实数据有点复杂,但这里有一个简化的版本。假设以下内容存储在字符串str中: 有关此数据,请注意以下事项: 请注意,第一个括号[]中有3组数据由{}分隔,第二个括号中有2组数据。字符串在每一组括号中始终至少有一组数据,并且至少有一组括号,即它永远不会是

我正在处理从AWK中的curl命令获得的一些结果,但尽管阅读了有关match和regexp的内容,我仍然有一些问题。我已经写了所有的东西,但是用了一种非常粗俗的方式,使用了很多substr和非常基本的匹配用法,而没有用regexp捕获任何东西

我的真实数据有点复杂,但这里有一个简化的版本。假设以下内容存储在字符串str中:

有关此数据,请注意以下事项:

请注意,第一个括号[]中有3组数据由{}分隔,第二个括号中有2组数据。字符串在每一组括号中始终至少有一组数据,并且至少有一组括号,即它永远不会是空字符串,并且始终在其中包含一些有效数据

括号也用于DataC数据,因此需要以某种方式考虑这些数据

除了分隔符之外,字符串中不会出现标点符号-所有实际数据都是字母数字

字段DataA、dataee和DataC将始终具有这些名称

DataC的数据总是正好是5个数字,用逗号分隔

我想做的是编写一个循环,它将遍历字符串并拉出值-在第一种情况下,a=无论数据a是200,b=无论数据基是63500,以及c[1]到c[5],其中包含来自数据c的值

我觉得如果我能得到一些关于如何处理上述数据的想法,我就可以用它来运行,以适应我的需要。到目前为止,我使用substr的循环大约有30行长:

为了好玩,使用awk:

我使用复杂的FS和RS变量来分割json。这样,我每列最多有一个值,每行有一个数据DataA,dataee,DataC

要了解FS和RS的用法,请参阅此命令的工作原理:

awk -F",|\":\"|:\\\[" '
    {$1=$1}1
' OFS="\t" RS="\",\"|},{|\\\]" file
您可以使用awk将文件替换为,以获得乐趣:

我使用复杂的FS和RS变量来分割json。这样,我每列最多有一个值,每行有一个数据DataA,dataee,DataC

要了解FS和RS的用法,请参阅此命令的工作原理:

awk -F",|\":\"|:\\\[" '
    {$1=$1}1
' OFS="\t" RS="\",\"|},{|\\\]" file
您可以将文件替换为我建议使用jq,例如:

要提取数据,请执行以下操作:

我建议使用jq,例如:

要提取数据,请执行以下操作:


请在问题中添加有用的示例输入和该示例输入所需的输出。您是否有任何理由使用awk而不是可以正确读取json的工具?例如python请在您的问题中添加有用的示例输入和该示例输入所需的输出。您有任何理由使用awk而不是可以正确读取json的工具吗?例如python
[{"DataA        200                           
DataBee 63500                                 
DataC"  3       22      64      838     2     

"DataA  190                                   
DataBee 63100                                 
DataC"  55      22      64      838     2     

"DataA  200                                   
DataBee 63500                                 
DataC"  3       22      64      838     2     
}                                             
[{"DataA        200                           
DataBee 63500                                 
DataC"  3       22      64      838     2     

"DataA  200                                   
DataBee 63500                                 
DataC"  3       22      64      838     2     
}                                     
awk -F",|\":\"|:\\\[" '
    /DataA/{a=$2}
    /DataBee/{b=$2}
    /DataC/{for(i=2;i<=NF;i++){c[i-1]=$i}}
    a!=""&&b!=""&&c[1]!=""{
        print "a: ", a; 
        print "b: ", b; 
        printf "c: "; 
        for(i in c){
            printf "%s, ", c[i]
        }; 
        print ""; 
        a=""; b=""; c[1]=""
    }
' RS="\",\"|},{|\\\]" file
a:  200
b:  63500
c: 3, 22, 64, 838, 2,
a:  190
b:  63100
c: 55, 22, 64, 838, 2,
a:  200
b:  63500
c: 3, 22, 64, 838, 2,
a:  200
b:  63500
c: 3, 22, 64, 838, 2,
a:  200
b:  63500
c: 3, 22, 64, 838, 2,
awk ' 
function find_all(str, patt) {
        while (match(str, patt, a) > 0) {
            for (i=1; i in a; i++) print a[i]
            str = substr(str, RSTART+RLENGTH)
        }
    }
{
    print "Catching DataA"
    find_all($0, "DataA\":\"([0-9]*)")
    print "Catching DataBee"
    find_all($0, "DataBee\":\"([0-9]*)")
    print "Catching DataC"
    find_all($0, "DataC\":.([0-9]*),([0-9]*),([0-9]*),([0-9]*),([0-9]*)")
}
' file
Catching DataA
200
190
200
200
200
Catching DataBee
63500
63100
63500
63500
63500
Catching DataC
3
22
64
838
2
55
22
64
838
2
3
22
64
838
2
3
22
64
838
2
3
22
64
838
2
import json

data_str = '[{"DataA":"200","DataBee":"63500","DataC":[3,22,64,838,2]},{"DataA":"190","DataBee":"63100","DataC":[55,22,64,838,2]},{"DataA":"200","DataBee":"63500","DataC":[3,22,64,838,2]}][{"DataA":"200","DataBee":"63500","DataC":[3,22,64,838,2]},{"DataA":"200","DataBee":"63500","DataC":[3,22,64,838,2]}]'

while data_str:
    data, index = json.JSONDecoder().raw_decode(data_str)
    for element in data:
        print("DataA: ", element["DataA"])
        print("DataBee: ", element["DataBee"])
        print("DataC: ", element["DataC"])
    data_str = data_str[index:]
DataA:  200
DataBee:  63500
DataC:  [3, 22, 64, 838, 2]
DataA:  190
DataBee:  63100
DataC:  [55, 22, 64, 838, 2]
DataA:  200
DataBee:  63500
DataC:  [3, 22, 64, 838, 2]
DataA:  200
DataBee:  63500
DataC:  [3, 22, 64, 838, 2]
DataA:  200
DataBee:  63500
DataC:  [3, 22, 64, 838, 2]
jq -c '.[]' <<<"$str"
jq -c '.[] | .DataC' <<<"$str"