Linux komut satırında anahtar / değer çiftlerinin hızlı çıkarılması


1

Veri içeren büyük (onlarca GB) bir metin dosyasına sahibim key=value;foo=bar;baz=quo biçim.

Tuşların sayısı ve sırası satırdan satıra değişebilir.

Bu dosyayı işlemeli ve foo anahtar, Linux komut satırından (kabuğu olarak bash kullanıyorum).

Yüklemeden bunu yapmanın en etkili yolu nedir Kocaman bağımlılıklar veya kod yazma?


Büyük dosyaları işlerken, dosyaları daha verimli kullanan başka bir komut dosyası dili kullanmayı da isteyebilirsiniz. Oldukça kolay bir çözüm Perl (çevrimiçi yüzlerce örnek var) ya da (n) awk denemelisiniz.
mtak

Aslında, bir betik dili olarak değil, bir cli kabuğu olarak bash demek istedim. Sorunu yansıtması düzeltildi. Yanlış anlaşılma için özür dilerim.
Alexander Gladysh

Yanıtlar:


1
sed -n -e 's/^foo=\([^;][^;]*\).*/\1/p'  -e 's/.*;foo=\([^;][^;]*\).*/\1/p' yourGBfile

-n seçeneği, tüm satırları yazdırma

-e 'script'

İlk -e betiği, bir satır başlıyorsa eşleşir foo= ve ikinci-b betiği bir foo= noktalı virgül izleyerek.

[^;] hiçbir noktalı virgülle eşleşmiyor demektir [^;][^;]* en az bir noktalı virgül olmayan (boş değerleri bulamazsınız!) anlamına gelir;

Parantezler, başvurulan konumsal bir dize içerir. \1.


1

Çok fazla veri var, bu yüzden hemen hemen her komut satırı çözümü yavaş olacaktır.

grep -oP '(?<=\bfoo=)[^;]+' file

0

Ayrıca daha hızlı olabilecek bir perl çözümü de deneyebilirsiniz: perl -nle 'print "$1" if /foo=(.*);/' filename.txt


Sizin .* çok açgözlü. Birden fazla noktalı virgül varsa, işe yaramazsa foo anahtar (diğer bir deyişle birden fazla (anahtar, değer) çifti izleniyor). Ve senin eşin işe yaramazsa foo satırdaki son anahtardır (hayır ; takip etme). Ve sadece bir emin olmak için bazı çapa eklemelisiniz foo= eşleşti ve değil somefoo= veya otherfoo=. Öneri: print $1 if /(?:^|;)foo=([^;]*)/.
Dubu

Oh, evet, @ glennjackman'ın kodunda olduğu gibi, açık bağlantı yerine, kelime / kelime olmayan sınır \b işe yarar: print $1 if /\bfoo=([^;]*)/
Dubu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.