LINUX - Shell Scripting - 从平面文件生成映射(键值对)

时间:2017-11-10 08:02:31

标签: linux shell csv parsing

我有一个类似于JSON的平面文件(不完全相同)。 最后的动机是将其转换为CSV(按特定顺序,与输入JSON文件不同)和转储到数据库中。现在因为输入文件并不总是以相同的顺序AWK,cut等不会有用。需要像HASHMAP这样的东西。附加样本输入和预期输出。建议请。

输入JSON文件样本(我有1000个文件,每个50K行,每个200列)

{"Field1":{"string":"Value,123"},"Field2":{"string":"564243"},"Field3":{"string":"SWCHP0001155"},"LOCATION":null,"OWNERUID":{"string":"655,,34"}}
{"Field1":{"string":"Value,456"},"Field2":{"string":"89565655"},"Field3":{"string":"SWCHP0001166"},"LOCATION":{"string":"BEACH,"},"OWNERUID":{"string":"65534"}}
........

输出CSV文件按特定顺序排序,按顺序说(OWNERUID,LOCATION,Field1,Field2,Field3)

655;;34,null,Value;123,564243,SWCHP0001155
65534,BEACH;,Value;456,89565655,SWCHP0001166

到目前为止我的想法是做一些字符串操作改变eveything一个标准格式如下,将数据传输到hashmap,fetch in required和dump in CSV

中级标准格式:(可以更改,请提示)

Field1?Value;123,Field2?564243,Field3?SWCHP0001155,LOCATION?null,OWNERUID?655;;34
Field1?Value;456,Field2?89565655,Field3?SWCHP0001166,LOCATION?BEACH;,OWNERUID?65534
........

请注意:

  1. 值包含,以及其他特殊字符
  2. 我可以将值更改为将逗号转换为分号(如上所述)
  3. 有待处理的NULL值

1 个答案:

答案 0 :(得分:1)

jq是一个旨在处理JSON字符串的C工具。它充当过滤器(或过滤器链),一次处理一个输入并具有相当不错的文档。它可能在您的发行版中可用,或假装从源代码构建,除了C编译器之外没有任何依赖性。在您的示例中,这应该足够了:

$ cat file.json |  jq '[.OWNERUID.string, .LOCATION.string?, .Field1.string?, .Field2.string?, .Field3.string?]|join(";")'
"655,,34;;Value,123;564243;SWCHP0001155"
"65534;BEACH,;Value,456;89565655;SWCHP0001166"
$

或者如果你想摆脱封闭的引号,sed过滤器可以删除它们:

$ cat ess.txt |  jq '[.OWNERUID.string, .LOCATION.string?, .Field1.string?, .Field2.string?, .Field3.string?]|join(";")' | sed -e 's/^"\(.*\)"$/\1/'
655,,34;;Value,123;564243;SWCHP0001155
65534;BEACH,;Value,456;89565655;SWCHP0001166
$