簡體   English   中英

LINUX - Shell Scripting - 從平面文件生成映射(鍵值對)

[英]LINUX - Shell Scripting - Generate map(key value pair) from flat file

我有一個類似於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,獲取所需和轉儲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值

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
$

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM