Ayrıştırma sed ve awk ile json
Json curl isteği gibi bir sp döndü ayrıştırmak için çalışıyorum:
curl 'http://twitter.com/users/username.json' | sed -e 's/[{}]/''/g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i ) print a[i]}'
Yani yukarıdaki döndürür . alanları içine json böler nerede çalıştığını belirledik
% ...
"geo_enabled":false
"friends_count":245
"profile_text_color":"000000"
"status":"in_reply_to_screen_name":null
"source":"web"
"truncated":false
"text":"My status"
"favorited":false
% ...
Ama yapmak istediğim şey belirli bir alan (- v k=metin tarafından belirtilen) kapmak ve sadece baskı.
Herhangi bir fikir?
CEVAP
Hızlı bir şekilde belirli bir anahtar değerleri ayıklamak için, ben şahsen kullanmak gibi "- o sadece normal ifade eşleşme döndürür.", grep Örneğin, "" Tweet alanı gibi bir şey . metin almak için
grep -Po '"text":.*?[^\\]",' tweets.json
Bu normal ifadenin sandığınızdan daha sağlam olur; örneğin, ince telli, içlerinde virgül ve kaçtı tırnak gömülü olması ilgilenir. Eğer atom aslında eğer değeri ayıklamak için garantili bir yapabiliriz biraz daha fazla çalışma bence. Eğer yuvalama (eğer varsa, o zaman bir düzenli ifade elbette bunu yapamaz.)
Ve daha fazla (dize orijinal kaçan tutulması da olsa) temiz bir şey gibi kullanabilirsiniz: | perl -pe 's/"text"://; s/^"//; s/",$//'
. (*. *15) için yaptım
Doğruluğu için önemlidir, ama . gerçek bir JSON kullanmanız gerekir ısrar eden tüm düşmanları için ayrıştırıcı -- Evet,
- Gerçekten hızlı bir analizi, değerler Veri Temizleme böcekleri kontrol etmek veya veri için genel bir fikir almak için sayma gibi yapmak için, komut satırında bir şeyler vurarak daha hızlı. Bir komut dosyası yazmak için bir editör açılması rahatsız edici.
grep -o
büyüklük açısından daha az tweetler ~2 KB her biri için bunu yaparken Python standartjson
kütüphane, daha iyidir. Emin değilim eğer bu diyejson
yavaş (gereken karşılaştırmak için yajl bir ara); ama prensip olarak, bir düzenli olması daha hızlı, hem de sonlu durum ve çok daha fazlası en iyi hale getirilebilen, yerine bir çözümleyici olan destek özyineleme, ve bu durumda, geçirdiği bir sürü CPU bina, ağaç yapıları düşünmüyorsun. Eğer birisi uygun (derinlik-sınırlı) JSON ayrıştırma yaptığını sonlu durum bir dönüştürücü yazdı (varsa, bu harika olurdu! Bu arada biz "- o".) grep
Sürdürülebilir kod yazmak için, ben her zaman gerçek bir ayrıştırma kitaplığı kullanın. jsawk, denemedim ama eğer iyi gelirse, bu #1 noktası adresi.
Son, saçması, çözüm: bir senaryo yazdım kullanan Python json
ve özler tuşları, sekme ile ayrılmış sütunlar; o zaman ben de borudan etrafında sarıcı awk
sağlar adlı erişmek için sütun. In here: the json2tsv and tsvawk scripts. Bu örnek için olur:
json2tsv id text < tweets.json | tsvawk '{print "tweet " $id " is: " $text}'
Bu yaklaşım yok Adres #2, daha verimli ve daha tek bir Python betiği ve biraz kırılgan: zorlar normalleştirme yeni satır ve sekme dize değerleri, iyiyi oynamaya ile awk alan/kayıt sınırlandırılmış bakış dünya. Ama sen grep -o
daha fazla doğruluk ile komut satırında kalmak izin yapar.
Ayrıştırma ruby JSON dize...
Nasıl ayrıştırma Scala standart Scala ...
JSON arasındaki fark.stringify ve JSON...
javascript yöntemi özel durum yakalama...
Nasıl Objective-C ile JSON ayrıştırma ...