Awk 将文本文件中的数据转换为JSON
我有一个名为Awk 将文本文件中的数据转换为JSON,awk,Awk,我有一个名为data.txt的文本文件中的数据,如 1。约翰(1994)92 2.奶奶(1972)82 我想使用Awk将此数据转换为JSON格式。预期结果: [{ "ID" : "1", "Name" : "John", "Birth" : "1994", "Marks" : "92" }] jq -R '[capture("(?<ID>[0-9]+)\\. *(?<Name>[^(]*) \\((?<Birth>
data.txt
的文本文件中的数据,如
1。约翰(1994)92
2.奶奶(1972)82
我想使用Awk将此数据转换为JSON格式。预期结果:
[{
"ID" : "1",
"Name" : "John",
"Birth" : "1994",
"Marks" : "92"
}]
jq -R '[capture("(?<ID>[0-9]+)\\. *(?<Name>[^(]*) \\((?<Birth>[^)]*)\\) *(?<Marks>[0-9]*)")]' data.txt
我用jq试过了
jq -R '[ split("\n")[] | select(length > 0) | split(" ") | {ID: .[0], Name: .[1], Birth: .[2], Marks: .[3]}]' data.txt
或者,您也可以执行以下操作
awk ' BEGIN { print "[" ; } \
{ print " {" \
print " \"ID\" : \"" $1 "\"," \
print " \"Name\" : \"" $2 "\"," \
print " \"Birth\" : \"" $3 "\"," \
print " \"Marks\" : \"" $4 "\"" \
print " }" \
} \
END { print "]" } ' data.txt
然后您可以看到以下输出
[
{
"ID" : "1.",
"Name" : "John",
"Birth" : "(1994)",
"Marks" : "92"
}
{
"ID" : "2.",
"Name" : "Granny",
"Birth" : "(1972)",
"Marks" : "82"
}
]
或者,您也可以执行以下操作
awk ' BEGIN { print "[" ; } \
{ print " {" \
print " \"ID\" : \"" $1 "\"," \
print " \"Name\" : \"" $2 "\"," \
print " \"Birth\" : \"" $3 "\"," \
print " \"Marks\" : \"" $4 "\"" \
print " }" \
} \
END { print "]" } ' data.txt
然后您可以看到以下输出
[
{
"ID" : "1.",
"Name" : "John",
"Birth" : "(1994)",
"Marks" : "92"
}
{
"ID" : "2.",
"Name" : "Granny",
"Birth" : "(1972)",
"Marks" : "82"
}
]
如果您想知道如何使用
jq
,这里有一种方法
parse.jq
按如下方式运行:
jq -R -f parse.jq infile.txt
输出:
{
"ID": "1",
"Name": "John",
"Birth": "1994",
"Marks": "92"
}
{
"ID": "2",
"Name": "Granny",
"Birth": "1972",
"Marks": "82"
}
如果您想知道如何使用
jq
,这里有一种方法
parse.jq
按如下方式运行:
jq -R -f parse.jq infile.txt
输出:
{
"ID": "1",
"Name": "John",
"Birth": "1994",
"Marks": "92"
}
{
"ID": "2",
"Name": "Granny",
"Birth": "1972",
"Marks": "82"
}
为了记录在案,以下jq one liner产生(似乎是)期望的结果:
[{
"ID" : "1",
"Name" : "John",
"Birth" : "1994",
"Marks" : "92"
}]
jq -R '[capture("(?<ID>[0-9]+)\\. *(?<Name>[^(]*) \\((?<Birth>[^)]*)\\) *(?<Marks>[0-9]*)")]' data.txt
如果要捕获单个阵列中的对象,可以使用输入
,例如:
jq -nR '[inputs|capture("(?<ID>[0-9]+)\\. *(?<Name>[^(]*) \\((?<Birth>[^)]*)\\) *(?<Marks>[0-9]*)")]' data.txt
jq-nR'[inputs | capture((?[0-9]+)\.*(?[^(]*)\\((?[^)]*)\\\)*(?[0-9]*)”)data.txt
OP还询问:
如果名称由空格分隔的字符串组成
上面的正则表达式允许在名称中使用空格。对于记录,以下jq one liner生成(似乎是)所需的结果:
[{
"ID" : "1",
"Name" : "John",
"Birth" : "1994",
"Marks" : "92"
}]
jq -R '[capture("(?<ID>[0-9]+)\\. *(?<Name>[^(]*) \\((?<Birth>[^)]*)\\) *(?<Marks>[0-9]*)")]' data.txt
如果要捕获单个阵列中的对象,可以使用输入
,例如:
jq -nR '[inputs|capture("(?<ID>[0-9]+)\\. *(?<Name>[^(]*) \\((?<Birth>[^)]*)\\) *(?<Marks>[0-9]*)")]' data.txt
jq-nR'[inputs | capture((?[0-9]+)\.*(?[^(]*)\\((?[^)]*)\\\)*(?[0-9]*)”)data.txt
OP还询问:
如果名称由空格分隔的字符串组成
上面的正则表达式允许在名称中使用空格。您对学习AWK感兴趣还是只想找到问题的解决方案?你有没有尝试过任何你一直在努力解决的问题?@MichaWiedenmann,我想要解决这个问题的方法,就是只使用awkDo,你想要第一行之后的每一行都被丢弃,或者只想要第二行?你是对学习AWK感兴趣,还是只想要解决你的问题?你有没有尝试过任何让你头疼的事情?@MichaWiedenmann,我想要解决这个问题的办法,就是只使用awkDo,你想要在第一行之后的每一行都被丢弃,或者只想要第二行?谢谢你的回答。。如果名称由空格分隔的字符串组成怎么办。我的意思是如果全名是“约翰·卡洛”。那么?谢谢你的回复。。如果名称由空格分隔的字符串组成怎么办。我的意思是如果全名是“约翰·卡洛”。那么,如何在这种情况下显示输出。我没有得到任何命令prompt@HenryOberoy:您使用的是哪个版本的
jq
?match()。我没有得到任何命令prompt@HenryOberoy:您使用的是哪个版本的jq
?match()