ध्यान दें कि प्रयास 2 में अतिरिक्त कोड को छोड़कर, सभी कोड वास्तव में ओपी द्वारा पूछे गए के विपरीत करते हैं। जैसा कि आप प्रयास 2 में देख सकते हैं, आज्ञाओं को अनुकूलित करना आसान है।
मेरे पास इसमें 1.108.752 लाइनों के साथ एक टेक्स्टफाइल था, आकार में लगभग 83 एमबी। मैं इसमें से ४६. wanted४४ रेखाएँ प्राप्त करना चाहता था, १५ वीं और १.१०th. line१६ वीं पंक्ति के बीच, जो औसतन हर २४ वीं पंक्ति है।
tl; डॉ;
दूसरा प्रयास पहले की तुलना में तेज है। तीसरा केवल कम लाइनों के लिए काम करता है।
पहला प्रयास (बुरा)
मैं चाहता हूं कि हर पंक्ति के लिए, sed
टेक्स्टफाइल की शुरुआत से लाइनें पढ़ता है, लेकिन उन्हें प्रिंट नहीं करता ( -n
)। जब यह मेरे इच्छित लाइन पर पहुंच जाता है p
, तो इसे प्रिंट करें ( ), फिर q
फ़ाइल के अंत में पढ़ने के बजाय छोड़ें ( )। फिर अगले लिनन के लिए फिर से करें।
जाहिर है, यह प्रत्येक रन में थोड़ा अधिक समय लेता है, क्योंकि sed
हर बार पहले की तुलना में अधिक लाइनों से गुजरना पड़ता है।
अगर मैंने उस सही गणना की, तो मेरे मामले में जो कुल मिलाकर लगभग 307332472188 टेक्स्टफाइल से गुजरता है। अरे मेरा।
ध्यान दें कि इस दृष्टिकोण के लिए लाइनों का क्रम लिनेनस फ़ाइल में अप्रासंगिक है:
while read line; do
sed -n "${line}{p;q}" "${INFILE}"
done
परिणाम समय: 2568.80s user 256.10s system 92% cpu 51:00.37 total
। अच्छा नहीं।
दूसरा प्रयास (बेहतर)
यह फ़ाइल से लिनन्र्स पढ़ता है और p
इस लाइन को प्रिंट करने के लिए (फिर से, फिर से जोड़ता है )। इस तार को आगे की तरफ लगाया जाता है, जो sed
एक फ़ाइल ( -f
) से पढ़ता है , जिसे यहाँ STDIN
लिखा गया है -
, जो कि हर बार पहली से आउटपुट है sed
, जो वास्तव में मुद्रित होने वाली लिननंबर है:
sed 's/$/p/' "${LINENUMS}" | sed -n -f - "${INFILE}"
परिणाम समय: 146.54s user 0.18s system 100% cpu 2:26.70 total
। काफी अच्छा!
आप चाहते हैं नहीं (ओपी की तरह करना चाहता था) linefile से लाइनों प्रिंट, थोड़ा आदेश ताकि linenumbers किया जा रहा है बदल d के बजाय eleted पी rinted, और प्रिंट के बजाय उन्हें (-n) को हटाने के अन्य सभी लाइनों:
sed 's/$/d/' "${LINENUMS}" | sed -f - "${INFILE}"
तीसरा प्रयास (बैडर)
यह मेरे लिए बिल्कुल भी काम नहीं कर रहा था क्योंकि मेरे पास बहुत सारी लाइनें थीं जिन्हें मैं निकालना चाहता था। यह (बहुत) कम लाइनों के लिए यद्यपि काम करना चाहिए, लेकिन मैं उस सीमा को नहीं जानता।
मैंने सीड के लिए एक लंबी स्ट्रिंग बनाने की कोशिश की, जिससे मुझे उम्मीद थी कि मैं sed
केवल एक बार फाइल के माध्यम से जाऊँगा!
sed -n "12p;15p;24p;345p;...;12345;" ${INFILE}"
लेकिन इससे 420076
वर्णों के बारे में एक तार लंबा हो जाएगा, जो कि पंप में sed
बस के लिए नेतृत्व करता है sed: Argument list is too long
। जो समझ में आता है।