সমান সংখ্যক লাইনের সাথে একটি বৃহত পাঠ্য ফাইলকে ছোট ফাইলগুলিতে কীভাবে বিভক্ত করবেন?


514

আমি একটি বৃহত (লাইনের সংখ্যায়) প্লেইন ফাইল পেয়েছি যা আমি ছোট ফাইলগুলিতে বিভক্ত করতে চাই, লাইন সংখ্যায়ও। সুতরাং যদি আমার ফাইলটির প্রায় 2M লাইন থাকে তবে আমি এটিকে 200 কে লাইনযুক্ত 10 টি ফাইলে বা 20k লাইন সমেত 100 টি ফাইলগুলিতে বিভক্ত করতে চাই (বাকিটি সহ একটি ফাইল; সমানভাবে বিভাজ্য হওয়া কোনও বিষয় নয়)।

পাইথনে আমি এটি মোটামুটি সহজেই করতে পারি তবে আমি ভাবছি যে ব্যাশ এবং ইউনিক্স ব্যবহারগুলি (ম্যানুয়ালি লুপিং এবং গণনা / পার্টিশন লাইনগুলির বিপরীতে) ব্যবহার করে এটি করার কোনও নিনজা উপায় আছে কিনা wond


2
কৌতূহলের বাইরে, তারা "বিভক্ত" হওয়ার পরে, কীভাবে কেউ তাদের "সংযুক্ত" করে? "বিড়াল পার্ট 2 >> পার্ট 1" এর মতো কিছু? নাকি অন্য নিনজা ইউটিলিটি আছে? আপনার প্রশ্ন আপডেট করার মন?
dlamotte

7
এটি আবার একসাথে রাখতে,cat part* > original
মার্ক বাইয়ার্স

9
হ্যাঁ বিড়াল সংক্ষিপ্ত জন্য সংক্ষিপ্ত। সাধারণভাবে অ্যাপ্রোপস উপযুক্ত কমান্ডগুলি সন্ধানের জন্য দরকারী। IE এর আউটপুটটি দেখুন:
এপ্রোপোস

@pixelbeat যে বেশ শান্ত, ধন্যবাদ
danben

3
একদিকে যেমন ওএস এক্স ব্যবহারকারীদের অবশ্যই নিশ্চিত করা উচিত যে তাদের ফাইলটিতে ম্যাক ওএস এক্স-এর পরিবর্তে লিনাক্স বা ইউএনআইএক্স-স্টাইল লাইন ব্রেক / এন্ড-অফ-লাইন সূচক (এলএফ) রয়েছে - স্টাইল-এর-লাইন সূচকগুলি (সিআর) - বিভক্ত এবং আপনার মত বিরতি যদি লাইনফিডের পরিবর্তে ক্যারিজ রিটার্ন হয় তবে সিএসপিলেট কমান্ডগুলি কাজ করবে না। আপনি ম্যাক ওএসে থাকলে বেয়ারবোনস সফটওয়্যার থেকে পাঠ্য র‌্যাঙ্গেলগার এটিতে আপনাকে সহায়তা করতে পারে। আপনি কীভাবে আপনার লাইন বিরতি অক্ষর দেখতে চান তা চয়ন করতে পারেন। যখন আপনি আপনার পাঠ্য ফাইলগুলি সংরক্ষণ করুন (বা হিসাবে সংরক্ষণ করুন ...)

উত্তর:


855

আপনি বিভাজন কমান্ড তাকিয়েছেন?

$ split --help
Usage: split [OPTION] [INPUT [PREFIX]]
Output fixed-size pieces of INPUT to PREFIXaa, PREFIXab, ...; default
size is 1000 lines, and default PREFIX is `x'.  With no INPUT, or when INPUT
is -, read standard input.

Mandatory arguments to long options are mandatory for short options too.
  -a, --suffix-length=N   use suffixes of length N (default 2)
  -b, --bytes=SIZE        put SIZE bytes per output file
  -C, --line-bytes=SIZE   put at most SIZE bytes of lines per output file
  -d, --numeric-suffixes  use numeric suffixes instead of alphabetic
  -l, --lines=NUMBER      put NUMBER lines per output file
      --verbose           print a diagnostic to standard error just
                            before each output file is opened
      --help     display this help and exit
      --version  output version information and exit

আপনি এরকম কিছু করতে পারেন:

split -l 200000 filename

যা প্রতিটি 200000 লাইনের নামের সাথে ফাইল তৈরি করবে xaa xab xac...

আর একটি বিকল্প, আউটপুট ফাইলের আকার দ্বারা বিভক্ত (এখনও লাইন বিরতিতে বিভক্ত):

 split -C 20m --numeric-suffixes input_filename output_prefix

output_prefix01 output_prefix02 output_prefix03 ...প্রতিটি সর্বোচ্চ 20 ম্যাগবাইটের মতো ফাইল তৈরি করে ।


16
আপনি আকার দ্বারা একটি ফাইলও বিভক্ত করতে পারেন: split -b 200m filename(মেগাবাইটের জন্য এম, কিলোবাইটের জন্য কে বা বাইটের জন্য প্রত্যয়)
অভি বেকার্ট

136
আকার দ্বারা বিভক্ত করুন এবং ফাইলগুলি লাইন বিরতিতে বিভক্ত হয়েছে তা নিশ্চিত করুন: স্প্লিট-সি 200 মি ফাইলের নাম
ক্লেটন স্ট্যানলি

2
বিভাজন ইউনিকোড (ইউটিএফ -16) ইনপুট দিয়ে গারবেল আউটপুট উত্পাদন করে। কমপক্ষে উইন্ডোজটিতে আমার কাছে সংস্করণ রয়েছে।
ভার্টিগো

4
@ জিওথোরি, টেক্সটর্যাংলার বা বিবিএডিট ব্যবহার করে প্রথমে সিআর (ম্যাক) লাইন এন্ডিংকে এলআর (লিনাক্স) লাইন এন্ডিংয়ে রূপান্তর করার বিষয়ে থ্রেডের আগে লেবারম্যাকের পরামর্শ অনুসরণ করতে ভুলবেন না। আমি সেই পরামর্শের অংশটি না পাওয়া পর্যন্ত আপনার মতো ঠিক একই সমস্যাটি পেয়েছিলাম।
স্ট্রিংগার

6
-dবিকল্পটি ওএসএক্সে উপলভ্য নয়, gsplitপরিবর্তে ব্যবহার করুন। আশা করি ম্যাক ব্যবহারকারীর জন্য এটি দরকারী।
ব্যবহারকারী5698801


39

হ্যাঁ, একটি splitআদেশ আছে। এটি লাইন বা বাইট দ্বারা একটি ফাইল বিভক্ত হবে।

$ split --help
Usage: split [OPTION]... [INPUT [PREFIX]]
Output fixed-size pieces of INPUT to PREFIXaa, PREFIXab, ...; default
size is 1000 lines, and default PREFIX is `x'.  With no INPUT, or when INPUT
is -, read standard input.

Mandatory arguments to long options are mandatory for short options too.
  -a, --suffix-length=N   use suffixes of length N (default 2)
  -b, --bytes=SIZE        put SIZE bytes per output file
  -C, --line-bytes=SIZE   put at most SIZE bytes of lines per output file
  -d, --numeric-suffixes  use numeric suffixes instead of alphabetic
  -l, --lines=NUMBER      put NUMBER lines per output file
      --verbose           print a diagnostic just before each
                            output file is opened
      --help     display this help and exit
      --version  output version information and exit

SIZE may have a multiplier suffix:
b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024,
GB 1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.

চেষ্টা করেছেন জর্জেক @ এটিজিআইএস 25 ~ $ বিভক্ত -l 100000 /cygdrive/P/2012/Job_044_DM_Radio_Propogation/Working/FinalPropogation/TRC_Longlands/trc_longlands.txt কিন্তু ডিরেক্টরিটিতে কোনও বিভক্ত ফাইল নেই-আউটপুট কোথায়?
জর্জিসি

1
এটি একই ডিরেক্টরিতে থাকা উচিত। উদাহরণস্বরূপ, যদি আমি প্রতি ফাইলের জন্য ১,০০,০০০ লাইন বিভক্ত করতে চান তবে নিম্নলিখিতটি করুন: split -l 1000000 train_file train_file.এবং একই ডিরেক্টরিতে আমি train_file.aaপ্রথম মিলিয়ন এবং তারপরে trail_file.abপরবর্তী মিলিয়ন ইত্যাদি নিয়ে পাব
উইল

1
@GeorgeC এবং আপনার উপসর্গ সাথে কাস্টম আউটপুট ডিরেক্টরি পেতে পারেন: split input my/dir/
সিরো সান্তিলি 郝海东 冠状 病 六四 事件

15

ব্যবহার split

কোনও ফাইলকে স্থির আকারের টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো ইনপুট ফাইল (স্ট্যান্ডার্ড ইনপুট যদি কিছু না দেওয়া হয় বা INPUT `- 'হয়)

Syntax split [options] [INPUT [PREFIX]]

http://ss64.com/bash/split.html


13

ব্যবহার করুন:

sed -n '1,100p' filename > output.txt

এখানে, 1 এবং 100 টি লাইন নম্বর যা আপনি গ্রহণ করবেন output.txt


এটি কেবল প্রথম ১০০ টি লাইনই পেয়েছে, আপনার পরের 101..200200 এ ধারাবাহিকভাবে ফাইলটি বিভক্ত করার জন্য আপনাকে এটি লুপ করতে হবে বা splitইতিমধ্যে আপনাকে এখানে সমস্ত শীর্ষ উত্তরের মতো ব্যবহার করুন like
ট্রিপলি

10

"file.txt" ফাইলটি ১০০০০০ লাইনের ফাইলগুলিতে বিভক্ত করুন:

split -l 10000 file.txt

9

split(জিএনইউ কোর্টিলস থেকে, ২০১০-১২-২২ পর্যন্ত ৮.৮ সংস্করণ থেকে ) নিম্নলিখিত প্যারামিটারটি অন্তর্ভুক্ত রয়েছে:

-n, --number=CHUNKS     generate CHUNKS output files; see explanation below

CHUNKS may be:
  N       split into N files based on size of input
  K/N     output Kth of N to stdout
  l/N     split into N files without splitting lines/records
  l/K/N   output Kth of N to stdout without splitting lines/records
  r/N     like 'l' but use round robin distribution
  r/K/N   likewise but only output Kth of N to stdout

সুতরাং, একই পরিমাণ বাইট সহ split -n 4 input output.চারটি ফাইল ( output.a{a,b,c,d}) উত্পন্ন করবে তবে লাইনগুলি মাঝখানে নষ্ট হয়ে যেতে পারে।

যদি আমরা সম্পূর্ণ রেখাগুলি সংরক্ষণ করতে চাই (যেমন লাইন দ্বারা বিভক্ত), তবে এটি কাজ করা উচিত:

split -n l/4 input output.

সম্পর্কিত উত্তর: https://stackoverflow.com/a/19031247


9

আপনি যদি প্রতিটি ফাইলকে x সংখ্যক লাইন দিয়ে বিভক্ত করতে চান তবে প্রদত্ত উত্তরগুলি splitঠিক আছে। তবে, আমি কৌতূহলী যে কেউ প্রয়োজনীয়তার দিকে মনোযোগ দেয় না:

  • "তাদের গণনা ছাড়াই" -> ডাব্লুসিটি + কাট ব্যবহার করে
  • "অতিরিক্ত ফাইলে বাকী থাকা" -> বিভাজন ডিফল্টরূপে হয়

আমি "wc + কাট" না করে এটি করতে পারি না, তবে আমি এটি ব্যবহার করছি:

split -l  $(expr `wc $filename | cut -d ' ' -f3` / $chunks) $filename

এটি সহজেই আপনার বাশার্ক ফাংশনে যুক্ত হতে পারে যাতে আপনি কেবল ফাইল নাম এবং অংশগুলি পাস করার জন্য এটি অনুরোধ করতে পারেন:

 split -l  $(expr `wc $1 | cut -d ' ' -f3` / $2) $1

অতিরিক্ত ফাইলের বাকী ছাড়াই আপনি কেবল x অংশ চান তবে প্রতিটি ফাইলে এটি যোগ করার জন্য সূত্রটি খাপ খাই (খণ্ড - 1)। আমি এই পদ্ধতির ব্যবহার করি কারণ সাধারণত আমি প্রতি ফাইলের জন্য এক্স লাইনের চেয়ে এক্স সংখ্যক ফাইল চাই:

split -l  $(expr `wc $1 | cut -d ' ' -f3` / $2 + `expr $2 - 1`) $1

আপনি এটি কোনও স্ক্রিপ্টে যুক্ত করতে পারেন এবং এটিকে আপনার "নিনজা উপায়" বলতে পারেন, কারণ যদি কোনও কিছুই আপনার প্রয়োজনের স্যুট না করে তবে আপনি এটি তৈরি করতে পারেন :-)


অথবা, কেবল -nবিকল্পটি ব্যবহার করুন split
অমিত নাইডু


0

এইচডিএফএস ছোট ফাইলটি ডুবে যায় এবং সম্পত্তি আকারে ছড়িয়ে পড়ে।

এই পদ্ধতিটি লাইন বিরতি সৃষ্টি করবে

split -b 125m compact.file -d -a 3 compact_prefix

আমি ডুবে যাওয়ার চেষ্টা করি এবং প্রতিটি ফাইলকে প্রায় 128 এমবিতে বিভক্ত করি।

# split into 128m ,judge sizeunit is M or G ,please test before use.

begainsize=`hdfs dfs -du -s -h /externaldata/$table_name/$date/ | awk '{ print $1}' `
sizeunit=`hdfs dfs -du -s -h /externaldata/$table_name/$date/ | awk '{ print $2}' `
if [ $sizeunit = "G" ];then
    res=$(printf "%.f" `echo "scale=5;$begainsize*8 "|bc`)
else
    res=$(printf "%.f" `echo "scale=5;$begainsize/128 "|bc`)  # celling ref http://blog.csdn.net/naiveloafer/article/details/8783518
fi
echo $res
# split into $res files with number suffix.  ref  http://blog.csdn.net/microzone/article/details/52839598
compact_file_name=$compact_file"_"
echo "compact_file_name :"$compact_file_name
split -n l/$res $basedir/$compact_file -d -a 3 $basedir/${compact_file_name}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.