2014-02-24 106 views
0

這是一個有點以.json文件,我需要找資料:找到兩個字符串之間的字符串的文件

"title": 
"Spring bank holiday","date":"2012-06-04","notes":"Substitute day","bunting":true}, 
{"title":"Queen\u2019s Diamond Jubilee","date":"2012-06-05","notes":"Extra bank holiday","bunting":true}, 
{"title":"Summer bank holiday","date":"2012-08-27","notes":"","bunting":true}, 
{"title":"Christmas Day","date":"2012-12-25","notes":"","bunting":true}, 
{"title":"Boxing Day","date":"2012-12-26","notes":"","bunting":true}, 
{"title":"New Year\u2019s Day","date":"2013-01-01","notes":"","bunting":true}, 
{"title":"Good Friday","date":"2013-03-29","notes":"","bunting":false}, 
{"title":" 

該文件是更長的時間,但它是文本的一個長行。

我想,以顯示它是什麼銀行假日在某個日期之後,並且如果它涉及彩旗。 我試過grep和sed但我找不出來。 我想是這樣的:

[command] between [date] and [}] display [title] and [bunting]/[no bunting] 

[title]應該僅僅是「聖誕節」或別的東西

忘了提: 我想在bash shell實現這一點,無論是從提示或者來自一小段代碼。

+1

那豈不是更容易映射到JSON對象(OOP語言),並從那裏走? – hovanessyan

+2

用於Linux的命令行工具結算 - jsawk - https://github.com/micha/jsawk和JQ - HTTP://stedolan.github。io/jq/tutorial/ – hovanessyan

回答

1

你可以使用awk試試這個:

awk -F"}," '{for(i=1;i<=NF;i++){print $i}}' file.json | awk -F"\"[:,]\"?" '$4>"2013-01-01"{printf "%s:%s:%s\n" ,$2,$4,$8}' 

眼見JSON文件是一個很長的字符串,我們首先對拆分此行成多個JSON記錄},。然後,每個單獨的記錄被分割的上一個組合「:,字符與任選的閉合。然後我們只在某一日期之後輸出該行。

1月1日2013年

後這將找到所有記錄

編輯:

第二屆AWK將每個單獨的JSON記錄到使用開始子字符串鍵值對,後跟一個,和一個可選的結局。 所以,在你的榜樣,將分割在任「」‘:’「:

所有奇數場是關鍵,且所有偶數場都值(因此4 $正在日期。你的例子)。然後,我們檢查,如果$ 4(日期)爲2013-01-01以後。

我發現我上犯了一個錯誤的可選(應遵循,而不是*)在拆分,我現在已經糾正,我也用printf函數來顯示值。

+0

謝謝,這對我來說足夠好,可以得到我需要的東西。你向我解釋第二行,但是......在|之後 – Alichino

2

你應該在一個體面的編程語言使用適當的JSON解析器,那麼你可以做很多以安全的方式工作,沒有太多的代碼。這小小的Python代碼如何:

#!/usr/bin/env python 

import json 

with open('my.json') as jsonFile: 
    holidays = json.load(jsonFile) 
for holiday in holidays: 
    if holiday['date'] > '2012-05-06': 
    print holiday['date'], ':', holiday['title'], \ 
      ("bunting" if holiday['bunting'] else "no bunting") 
    break # in case you only want one line of output 

我找不出什麼輸出應該是;如果你可以更具體,我可以調整我的例子。

+0

我需要在cygwin中運行Python腳本?輸出應該是:[date]:「[bank-holiday-title],bunting/no bunting。Thx – Alichino

+0

Wow,在cygwin問題中標記'unix',這很奇怪;-)但是沒關係。當然,在Unix系統上,這通常是預先安裝的,但是在Windows世界中可能會有更好的選擇(我在你的問題中加了一個cygwin標籤。) – Alfe

相關問題