কীওয়ার্ডের সীমানা ব্যবহার করে কোনও ফাইলকে কীভাবে বিভক্ত করবেন


15

আমার কাছে একটি ভিসিএফ ফাইল রয়েছে যাতে অসংখ্য ভিকার্ড রয়েছে।

ভিসিএফ ফাইলটি আউটলুকে আমদানি করার সময় মনে হয় কেবল প্রথম ভিসার্ডটিই আমদানি করা।

তাই আমি তাদের বিভক্ত করতে চাই।

দেওয়া হয়েছে যে একটি ভিকার্ড শুরু হয়

BEGIN:VCARD

এবং শেষ হয়

END:VCARD

প্রতিটি ভিকার্ডকে তার নিজের ফাইলে বিভক্ত করার সর্বোত্তম উপায় কী।

ধন্যবাদ

হালনাগাদ

সমস্ত প্রতিক্রিয়া জন্য ধন্যবাদ। এই প্রকৃতির প্রশ্নগুলির মতো বিড়ালকে ত্বকের বিভিন্ন উপায় রয়েছে। আমি যেটি করেছি তাকে কেন বেছে নেওয়ার যুক্তি এখানে।

একত্র চালান

এখানে প্রতিটি উত্তরের থেকে আমি কী পছন্দ করেছি এবং তার মধ্যে একটি নির্বাচন করতে আমাকে কী কারণে চালিত হয়েছে তার একটি বৃত্তান্ত এখানে রয়েছে।

  • csplit: আমি সত্যিই এই পদ্ধতির সংক্ষিপ্ততা পছন্দ করেছি। আমি কেবল এই ইচ্ছা করেছিলাম যে এটি ফাইলের এক্সটেনশানটিও সেট করতে সক্ষম হবে।
  • gawk: এটি আমি যা জিজ্ঞাসা করেছি তা সবই করেছে।
  • paralell: কাজ করছে. তবে আমাকে নতুন জিনিস ইনস্টল করতে হয়েছিল। (এটি আমার বাড়ীতে একটি নতুন / বিন দির তৈরি করার সিদ্ধান্ত নিয়েছে)
  • perl: আমি পছন্দ করেছি যে এটি পরিচিতির নামের উপর ভিত্তি করে ভিসিএফ তৈরি করেছে। তবে -o বিকল্পটি বাস্তবে কার্যকর হয়নি

উপসংহার

  • তাই প্রথমে যাবার perlকারণটি ছিল কিছুটা ভাঙ্গা
  • এর পরে ছিল paralellকারণ আমাকে নতুন জিনিস ইনস্টল করতে হয়েছিল
  • পরবর্তীটি ছিল csplit, কারণ যতদূর আমি দেখতে পাচ্ছি এটি আউটপুট ফাইলগুলিতে এক্সটেনশন তৈরি করতে পারে না
  • সহজেই উপলব্ধ এমন একটি ইউটিলিটি হওয়ার জন্য এবং পুরষ্কারটি যথেষ্ট পরিমাণে যাতে আমি ফাইলের নামটি কিছুটা কাটা ও পরিবর্তন করতে পারি, এ জন্য পুরষ্কারটি ছাপিয়ে যায়। বোনাস নম্বরও cmp:)

আপনি ব্যবহার চেষ্টা করেছেন -b?
ইগনাসিও ওয়াজকেজ-আব্রামস

উত্তর:


11

আপনি কাজের জন্য awk ব্যবহার করতে পারেন:

$ curl -O https://raw.githubusercontent.com/qtproject/qt-mobility\
/d7f10927176b8c3603efaaceb721b00af5e8605b/demos/qmlcontacts/contents/\
example.vcf

$ gawk ' /BEGIN:VCARD/ { close(fn); ++a; fn=sprintf("card_%02d.vcf", a); 
        print "Writing: ", fn } { print $0 > fn; } ' example.vcf
Writing:  card_01.vcf
Writing:  card_02.vcf
Writing:  card_03.vcf
Writing:  card_04.vcf
Writing:  card_05.vcf
Writing:  card_06.vcf
Writing:  card_07.vcf
Writing:  card_08.vcf
Writing:  card_09.vcf

$ cat card_0* > all.vcf
$ cmp example.vcf all.vcf
$ echo $?
0

বিস্তারিত

অ্যাজক লাইনটি এটির মতো কাজ করে: aপাল্টা যা প্রতিটি BEGIN:VCARDলাইনে বৃদ্ধি হয় এবং একই সময়ে স্প্রিন্টফ (সঞ্চিত fn) ব্যবহার করে আউটপুট ফাইলের নাম নির্মিত হয় । প্রতিটি লাইনের জন্য বর্তমান লাইন ( $0) বর্তমান ফাইলটিতে যুক্ত করা হয় (নামযুক্ত fn)।

গত echo $?অর্থ যে cmpসফল হয়েছে, IE সব একক ঘনিভূত ফাইল মূল উদাহরণ vcf উদাহরণ সমান।

মনে রাখবেন যে awk এ আউটপুট পুনর্নির্দেশ শেলের চেয়ে আলাদাভাবে কাজ করে। এর অর্থ > fnহ'ল ফাইলটি ইতিমধ্যে খোলা আছে কি না এবং প্রথমে awk পরীক্ষা করে। যদি এটি ইতিমধ্যে খোলা থাকে তবে অ্যাডক এটি এতে যুক্ত হয় । যদি তা না হয় তবে এটি এটি খুলবে এবং কেটে যাবে।

এই পুনঃনির্দেশ যুক্তির কারণে আমাদের স্পষ্টভাবে খোলা ফাইলগুলি বন্ধ করতে হবে, অন্যথায় ইনপুট ফাইলটিতে অনেক রেকর্ড রয়েছে এমন ক্ষেত্রে কলটি ওপেন ফাইলের সীমাতে আঘাত হানে।


আরও বেশি খোলার ফাইল ত্রুটি এড়ানোর জন্য আপনাকে ফাইলটি বন্ধ করতে হবে। stackoverflow.com/questions/32878146/… সুতরাং আদেশটি হ'ল: গাওক '/ বিজিইএন: ভিসিআরডি / {ক্লোজ (এফএন); ++, একটি; fn = স্প্রিন্ট্ফ ("কার্ড_% 02 ডি.ভিসিএফ", ক); মুদ্রণ "রাইটিং:", fn} {মুদ্রণ $ 0 >> fn; example 'উদাহরণ.vcf
ডেন বেনেট

@ ড্যানবেট ইঙ্গিতটির জন্য আপনাকে অনেক ধন্যবাদ! আমি আমার উত্তর আপডেট করেছি এবং পুনঃনির্দেশ যুক্তি / স্থির পুনঃনির্দেশ সম্পর্কিত নোটগুলিও সরলীকরণ করেছি।
ম্যাক্সচলেপজিগ


5

সিএসপ্লিটের জ্ঞানু সংস্করণটি এক্সটেনশান সেট করতে পারে - Ignacio এর উত্তর আমার মনে হয় সবচেয়ে সংক্ষিপ্ত, এক্সটেনশনটি পেতে এটি শেষ মুহুর্তে দরকার ছিল - 'প্রিন্টফ' ফর্ম্যাটটি ব্যবহার করে:

csplit -f vcard -b %02d.vcard input.txt -z '/END:VCARD/+1' '{*}'

Gnu csplitম্যান পৃষ্ঠা থেকে প্রাসঙ্গিক স্নিপেট এখানে :

   -b, --suffix-format=FORMAT
          use sprintf FORMAT instead of %02d

আমি ম্যাক ব্যবহার করছিলাম এবং এর পরিবর্তে জিএসপিএসপ্লিট ব্যবহার করতে আমার কিছুটা সময় লেগেছে, তবে একবার এই উত্তরটি আমাকে সাহায্য করেছিল।
লুক গিডিয়ন

4

কাজটি করতে আপনি এই স্ক্রিপ্টটি ব্যবহার করতে পারেন। একে স্প্লিট-ভিসিএফ-ফাইল বলা হয়

ব্যবহারের উদাহরণ

$ split_vcf.pl 

Error! Input VCF filename missing,  -i

Usage: perl split_vcf.pl -i input_file -o output_dir [OPTION]

    -v,         Verbosity levels, 1-3

স্ক্রিপ্টটি চালাতে:

mkdir vcf_files
split_vcf.pl  -i current.vcf -o vcf_files

split_vcf.pl একটি উইন্ডোজ সংস্করণ। ইউনিক্সের জন্য সাব মেক-ফাইল ফাইলটি পরিবর্তন করুন যা ফাইলনামগুলিতে একটি "\" যুক্ত করেছিল।
জে ড্যান

4

জিএনইউ সমান্তরাল ব্যবহার করে আপনি এটি করতে পারেন:

cat foo.vcf | parallel --pipe -N1 --recstart BEGIN:VCARD 'cat >{#}'

অথবা আপনি যদি http://oletange.blogspot.com/2013/10/useless-use-of-cat.html খণ্ডন করতে পারেন তবে আপনি এটির পরিবর্তে এটি ব্যবহার করতে পারেন:

< foo.vcf parallel --pipe -N1 --recstart BEGIN:VCARD 'cat >{#}'

আরও উদাহরণ দেখুন: http://www.gnu.org/software/parallel/man.html

পরিচিতি ভিডিওগুলি দেখুন: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

10 সেকেন্ড ইনস্টলেশন:

$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
   fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 3374ec53bacb199b245af2dda86df6c9
12345678 3374ec53 bacb199b 245af2dd a86df6c9
$ md5sum install.sh | grep 029a9ac06e8b5bc6052eac57b2c3c9ca
029a9ac0 6e8b5bc6 052eac57 b2c3c9ca
$ sha512sum install.sh | grep f517006d9897747bed8a4694b1acba1b
40f53af6 9e20dae5 713ba06c f517006d 9897747b ed8a4694 b1acba1b 1464beb4
60055629 3f2356f3 3e9c4e3c 76e3f3af a9db4b32 bd33322b 975696fc e6b23cfb
$ bash install.sh
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.