বেশ কয়েকটি আউটপুট ফাইলগুলিতে যাওয়ার জন্য স্টডআউটকে কীভাবে ভাগ করবেন?


12

বলুন, আমার কাছে একটি কমান্ড রয়েছে commandযা বিপুল সংখ্যক লাইন stdout- এ মুদ্রণ করে:

line1
line2
.....
lineN

আমি আউটপুটটি ডিস্কে সংরক্ষণ করতে চাই, তবে একক ফাইল হিসাবে নয়, তবে প্রতিটি স্টাডাউটের 1000 লাইন থাকা ফাইলের ক্রম হিসাবে:

file0001.txt:
-------------
line1
....
line1000

file0002.txt:
-------------
line1001
....
line2000

etc

আমি উত্তরটি গুগল করার চেষ্টা করেছি, তবে প্রতিবার গুগল আমাকে teeকমান্ডের দিকে নির্দেশ করে, যা এই পরিস্থিতিতে অকেজো। সম্ভবত, আমি ভুল প্রশ্ন লিখছি entering

উত্তর:


24

একবার আপনি ফাইলটি সংরক্ষণ করার পরে, আপনি সর্বদা splitলাইন সংখ্যার ভিত্তিতে ফাইল টুকরো টুকরো বা একাধিক ফাইলগুলিতে ফাইল করতে পারেন ।

split -l 1000 output_file

বা আরও ভাল চেষ্টা করুন

command | split -l 1000 -

এটি প্রতি 1000 লাইনের সাথে আউটপুট প্রবাহকে ফাইলগুলিতে বিভক্ত করবে (-l বিকল্প ছাড়াই ডিফল্টটি 1000 লাইন)।

নীচের কমান্ডটি আপনাকে ফাইলনামে একটি উপসর্গ স্থাপন বা প্রয়োগের জন্য অতিরিক্ত নমনীয়তা দেবে যা আউটপুট উত্পন্ন হওয়ার পরে এবং ফাইলটিতে সঞ্চয় করার জন্য বিভক্ত হয়ে উত্পন্ন হবে।

command | split -l 1000 - small-


আমি বিভ্রান্ত হয়ে পড়েছিলাম, তাই অন্যদের জন্য এটির split [arguments...] [input e.g. "-" for stdin] [output_prefix]উদাহরণস্বরূপ: tar -c somedir | split --byes 100MB --numeric-suffixes --suffix-length=3 - somedir.tar.part-100MB ফাইলের একগুচ্ছ নামিয়ে দেওয়া হবে somedir.tar.part-000, 001, 002 আনসস।
থারস্মমনার

3

আপনি বাশ স্ক্রিপ্ট ব্যবহার করতে পারেন lines.bash

#!/bin/bash
a=0
while IFS='' read -r line
do
  printf -v filename "%04d.txt" "$((a++/1000))"
  echo "$line" >> $filename
done

এবং এটি হিসাবে ব্যবহার করুন:

cat long_file.txt | bash lines.bash

আমি যে সমস্যাটি লক্ষ্য করেছি তা হ'ল *সাইন ইন long_file.txt(কেউ এটিকে সংশোধন করতে পারে) with


2
IFSশব্দের বিভাজন এড়াতে খালি স্ট্রিংয়ে সেট করুন read-rব্যাকস্ল্যাশ পলায়ন নিষ্ক্রিয় করতে ব্যবহার করুন read-eব্যাকস্ল্যাশ এড়িয়ে চলা এড়াতে সরান echo। শব্দের বিভাজন এড়াতে উদ্ধৃতি ব্যবহার করুন echo। ব্যবহার করুন -vমধ্যে bashযেহেতু 4.0 উপ-প্রক্রিয়া শুরু এড়ানো। পোস্ট-ইনক্রিমেন্টিং ব্যবহার করুন কারণ আপনার বর্তমান কোডটি প্রথম ফাইলটিতে কেবল 999 লাইন রাখবে। a=0; while IFS='' read -r line; do printf -v filename "%04d.txt" $((a++/1000)); echo "$line" >> "$filename"; done
manatwork

@ মান্যাটওয়ার্ক আপনাকে ধন্যবাদ শুধুমাত্র আমার printfনেই -vসুইচ। ( bash 4.2.10)। কমপক্ষে এটি printf
ম্যানপেজে

1
man printfডকুমেন্টস / ইউএসআর / বিন / প্রিন্টফ, যা জীবনে কখনই পরিবেশের পরিবর্তনশীল সেট করতে পারে না। দেখুন help printfজন্য printfবিল্ট-ইন শেল এর ডকুমেন্টেশন।
manatwork

@ মান্যাটওয়ার্ক ঠিক আছে ++/অংশটিতে সিনট্যাক্স ত্রুটি আছে বলে মনে হচ্ছে ।
xralf

1
আরও একটি জিনিস: গাণিতিক মূল্যায়নের ভিতরে সিগিল ব্যবহার করার দরকার নেই, যদি না আপনার স্পষ্টভাবে প্যারামিটারের প্রসারণ প্রয়োজন হয়। পাটিগণিতের বিস্তারে ভেরিয়েবলগুলি যেভাবেই মূল্যায়ন করা হয়।
manatwork
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.