تقسيم الملف وسطوره ضمن Linux/bash
-
09-06-2019 - |
سؤال
لدي ملف كبير نوعًا ما (150 مليون سطر من 10 أحرف).أحتاج إلى تقسيمه إلى 150 ملفًا يتكون كل منها من 2 مليون سطر، بحيث يكون كل سطر إخراج هو أول 5 أحرف أو آخر 5 أحرف من السطر المصدر.يمكنني القيام بذلك بسرعة في لغة Perl، لكنني كنت أتساءل عما إذا كان هناك حل سهل باستخدام bash.أيه أفكار؟
المحلول
العمل في المنزل؟:-)
أعتقد أن أنبوبًا بسيطًا به sed (لتقسيم كل سطر إلى قسمين) وتقسيم (لتقسيم الأشياء إلى ملفات متعددة) سيكون كافيًا.
أمر الرجل هو صديقك.
تمت إضافته بعد التأكد من أنه ليس واجبًا منزليًا:
ماذا عن
sed 's/\(.....\)\(.....\)/\1\n\2/' input_file | split -l 2000000 - out-prefix-
?
نصائح أخرى
أعتقد أن شيئًا كهذا يمكن أن ينجح:
out_file=1
out_pairs=0
cat $in_file | while read line; do
if [ $out_pairs -gt 1000000 ]; then
out_file=$(($out_file + 1))
out_pairs=0
fi
echo "${line%?????}" >> out${out_file}
echo "${line#?????}" >> out${out_file}
out_pairs=$(($out_pairs + 1))
done
لست متأكدًا مما إذا كان الأمر أبسط أو أكثر كفاءة من استخدام لغة Perl.
أول خمسة أحرف من كل متغير سطر، بافتراض أن الملف الكبير يسمى x.txt، وبافتراض أنه من المقبول إنشاء ملفات في الدليل الحالي بأسماء x.txt.* :
Split -l 2000000 x.txt x.txt.out && (لملف Splitfile في x.txt.out*;افعل outfile = "$ {splitfile}.firstfive"؛صدى "$splitfile -> $outfile";قطع -c 1-5 "$splitfile" > "$outfile";منتهي)