Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Awk 将文本文件中的数据转换为JSON_Awk - Fatal编程技术网

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()