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