मेरे पास टर्मिनल में निम्नलिखित जानकारी छपी है और जैसा कि आप पहली और दूसरी पंक्तियों में कॉलम की संख्या देख सकते हैं

Strms  Blocks   Compressed Uncompressed  Ratio  Check   Filename
    1       1  2,526.9 MiB    317.1 GiB  0.008  CRC64   rar.stadium.trace.xz

इसलिए, अगर मैं awk '{print $3 "\t" $4}' का उपयोग करता हूं, तो मुझे मिलेगा

Compressed  Uncompressed
2,526.9 MiB

जो मैं नहीं चाहता। कोई विचार?

awk
1
mahmood 8 जुलाई 2019, 10:48

2 जवाब

सबसे बढ़िया उत्तर

इस तरह प्रत्येक क्षेत्र की चौड़ाई निर्धारित करने के लिए FIELDWIDTHS पैरामीटर gnu awk के साथ प्रयोग करें:

xz -l t.xz | awk '{print $3"\t"$4}' FIELDWIDTHS="5 8 13 13 7 7 99"
   Compressed    Uncompressed
     79.7 MiB       553.9 MiB
  2,526.9 MiB       317.1 GiB

संपादित करें: यदि आवश्यक हो तो लंबे फ़ाइल नाम को संभालने के लिए अंतिम फ़ाइल सेट 99 पर सेट करें
संपादित करें 2: स्थान और क्षेत्र की लंबाई को बेहतर ढंग से संभालने के लिए
संपादित करें3: FIELDWIDTHS="5 8 13 13 7 7 *" का उपयोग किया जा सकता है।

4
Jotne 8 जुलाई 2019, 17:49

यदि आप GNU awk का उपयोग करना चाहते हैं, तो आप FIELDWIDTHS निर्धारित करने के लिए पहली पंक्ति को पार्स कर सकते हैं:

awk '(NR==1){ for(i=1;i<=NF;++i) {match($0," *"$i); f=f" "RLENGTH};
              FIELDWIDTHS=f; $0=$0}
     {print $3,$4}'

देखें एडमॉर्टन की टिप्पणी उपरोक्त में सुधार और तर्क के लिए क्यों।

यदि आपके पास GNU awk तक पहुंच नहीं है, तो आप रोबोट मोड का उपयोग करके xz के आउटपुट को आसानी से पार्स करने योग्य बना सकते हैं:

रोबोट मोड --robot विकल्प के साथ सक्रिय होता है। यह xz के आउटपुट को अन्य प्रोग्रामों द्वारा पार्स करना आसान बनाता है। वर्तमान में --robot केवल --version, --info-memory, और --list के साथ समर्थित है। इसे भविष्य में कंप्रेशन और डीकंप्रेसन के लिए सपोर्ट किया जाएगा।

xz --robot --list टैब से अलग किए गए आउटपुट का उपयोग करता है। प्रत्येक पंक्ति के पहले कॉलम में एक स्ट्रिंग होती है जो उस पंक्ति पर मिली जानकारी के प्रकार को इंगित करती है:

एकल फ़ाइल के लिए, आप file पंक्ति में रुचि रखते हैं:

फ़ाइल लाइनों के कॉलम:

  1. फ़ाइल में धाराओं की संख्या
  2. स्ट्रीम में ब्लॉक की कुल संख्या
  3. फ़ाइल का संकुचित आकार
  4. फ़ाइल का असम्पीडित आकार
  5. संपीड़न अनुपात, उदाहरण के लिए 0.123। यदि अनुपात 9.999 से अधिक है, तो अनुपात के बजाय तीन डैश (---) प्रदर्शित होते हैं।
  6. अखंडता जाँच नामों की अल्पविराम से अलग की गई सूची। ज्ञात चेक प्रकारों के लिए निम्न स्ट्रिंग्स का उपयोग किया जाता है: कोई नहीं, CRC32, CRC64, और SHA-256। अज्ञात चेक प्रकारों के लिए, अज्ञात-एन का उपयोग किया जाता है, जहां N एक दशमलव संख्या (एक या दो अंक) के रूप में चेक आईडी है।
  7. फ़ाइल में स्ट्रीम पैडिंग का कुल आकार

तो आप जिस चीज में रुचि रखते हैं वह है:

xz --robot -l file.xz | awk 'BEGIN{FS=OFS="\t"; print "Compressed", "Uncompressed"}/file/{print $4,$5}'

यदि आप इसे मानव-पठनीय प्रारूप में चाहते हैं, तो आप इस फ़ंक्शन का उपयोग awk में कर सकते हैं:

function tohuman(size, t,u,s) {
    split( "B KiB MiB GiB TiB PiB EiB ZiB YiB" , u, " ");
    t=size; s=1; while( t>1024 ){ t/=1024; s++ }
    return sprintf("%6.1f %s", t, u[s]) }
2
kvantour 8 जुलाई 2019, 17:21