SORU
23 Aralık 2009, ÇARŞAMBA


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
27 Temmuz 2011, ÇARŞAMBA


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,

  1. 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.
  2. grep -o büyüklük açısından daha az tweetler ~2 KB her biri için bunu yaparken Python standart json kütüphane, daha iyidir. Emin değilim eğer bu diye json 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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • gsipek

    gsipek

    20 Temmuz 2007
  • kimberly p

    kimberly p

    23 Ocak 2010
  • Klemens Torggler

    Klemens Torg

    11 Mart 2008