গেডিট বা কমান্ড লাইন দিয়ে কোনও পাঠ্য ফাইলের প্রতিটি চতুর্থ লাইনটি সংশোধন করা সম্ভব?


11

আমি একটি পাঠ্য ফাইলকে একটি ট্যাব দ্বারা বিভক্ত স্প্রেডশিটে রূপান্তরিত করার চেষ্টা করছি। আমার পাঠ্য ফাইলটি এরকম কিছু:

Dog
Cat
Fish
Lizard
Wolf
Lion
Shark
Gecko
Coyote
Puma
Eel
Iguana

গেডিট বা লিব্রেঅফিসে স্ট্যান্ডার্ড অনুসন্ধান এবং ফাংশনগুলি প্রতিস্থাপনের সাহায্যে লাইনের শেষটি ট্যাব দিয়ে প্রতিস্থাপন করা সহজ। তবে আমি যদি ট্যাবগুলির জন্য কেবল গাড়ীর ফেরতের বিনিময় করি তবে আমি এটি পেয়ে যাব:

Dog   Cat   Fish   Lizard   Wolf   Lion   Shark   Gecko   Coyote   Puma   Eel   Iguana

তবে আমার যা করা দরকার তা হ'ল এটির মতো দেখতে:

Dog   Cat   Fish   Lizard
Wolf   Lion   Shark   Gecko  
Coyote   Puma   Eel   Iguana

সুতরাং, আমি কি প্রতিটি চতুর্থ লাইন ব্যতীত কোনও ট্যাবের জন্য লাইন চরিত্রের প্রতিটি প্রান্তকেই অদলবদল করতে পারি ?

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


হালনাগাদ:

আমি নিম্নলিখিত আদেশগুলি চেষ্টা করেছিলাম:

sed 'N;N;N;s/\n/\t/g' file > file.tsv

paste - - - - < file > file.tsv

pr -aT -s$'\t' -4 file > file.tsv

xargs -d '\n' -n4 < inputfile.txt

কিন্তু যখন আমি ফলত tsvফাইলটি LibreOffice- এ খোলার চেষ্টা করি , কলামগুলি বেশ সঠিক নয়। আমি নিশ্চিত না যে এর অর্থ আমি উপরের কমান্ডগুলি সঠিকভাবে সম্পাদন করছি না, বা যদি আমি LibreOffice আমদানি ফাংশনে কিছু ভুল করছি:

টিএসভি ক্যালক খোলার

কেবল রেফারেন্সের জন্য, পছন্দসই ফলাফলটি দেখতে এমন হওয়া উচিত:

যথাযথ কলাম

উত্তর:


16

আপনি যেমন কমান্ড-লাইন সম্পাদক ব্যবহার করতে পারেনsed

sed 'N;N;N;s/\n/\t/g' file > file.tsv

বা, আরও অগ্রগতিগতভাবে, আপনি জিএনইউ সেডের ঠিকানা অপারেটরটি ব্যবহার করে যোগ দিতে চান এবং প্রতিটি অব্যাহত রেখায় যোগদানের জন্য ক্লাসিক ওয়ান-লাইনারের সাথে অনুসরণ করে প্রতিটি লাইনে ব্যাকস্ল্যাশ লাইন ধারাবাহিকতা অক্ষর যুক্ত করে n skip m:

sed '0~4! s/$/\t\\/' file | sed -e :a -e '/\\$/N; s/\\\n//; ta'

উদাহরণস্বরূপ শেড ওয়ান-লাইনার ব্যাখ্যা করা দেখুন :

  1. যদি একটি ব্যাকস্ল্যাশ "\" দিয়ে শেষ হয় তবে পরের দিকে একটি লাইন যুক্ত করুন।

    sed -e :a -e '/\\$/N; s/\\\n//; ta'
    

তবে আইএমএইচও এটি অন্যান্য স্ট্যান্ডার্ড পাঠ্য-প্রক্রিয়াকরণ ইউটিলিটিগুলির সাথে সহজতর হবে

paste - - - - < file > file.tsv

(সংখ্যাটি -কলামগুলির সংখ্যার সাথে মিলিত হবে) বা

pr -aT -s$'\t' -4 file > file.tsv

( -s$'\tযদি আপনি আউটপুটটিকে একাধিক ট্যাব দ্বারা পৃথক করতে মানা না করেন তবে আপনি বাদ দিতে পারেন)।


আপনি যে অদ্ভুত পুনঃ আমদানি আচরণটি পর্যবেক্ষণ করছেন এটি প্রায় অবশ্যই কারণ মূল ফাইলটিতে উইন্ডোজ-স্টাইলের সিআরএলএফ লাইন শেষ রয়েছে। যদি আপনার উইন্ডোজ থেকে ফাইলগুলি নিয়ে কাজ করা দরকার হয়, তবে আপনি বিভিন্নভাবে যেমন কমান্ডে রূপান্তরটি রোল করতে পারেন eg

tr -d '\r' < file.csv | paste - - - -

অথবা

sed 'N;N;N;s/\r\n/\t/g' file.csv

প্রাক্তনটি সমস্ত ক্যারিজের রিটার্ন সরিয়ে ফেলবে যেখানে উত্তরোত্তর প্রতিটি নতুন লাইনের শেষে একটি সিআর সংরক্ষণ করবে (উদ্দেশ্যযুক্ত ব্যবহারকারী উইন্ডোজে থাকলে আপনি যা চান তা হতে পারে)।


1
উইন্ডোজ-স্টাইলের লাইন শেষ সম্পর্কে একটি নোট: তাদের এবং ইউনিক্স-স্টাইলের মধ্যে রূপান্তর করার মানক সরঞ্জামগুলি হ'ল dos2unixএবং unix2dos
ডেভিড ফোরস্টার

13

আপনি xargsসর্বদা চারটি রেখাকে একটি করে আলাদা করে আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা স্থান ব্যবহার করতে পারবেন each

xargs -d '\n' -n4 < inputfile.txt

-d '\n'ইনপুট ডিলিমিটারটিকে একটি নতুন লাইন চরিত্রে সেট করে, অন্যথায় এটি ফাঁকা স্থানগুলিতেও ভেঙে যায়। যদি আপনার কাছে কেবল যাইহোক ইনপুট লাইনে একটি শব্দ থাকে তবে আপনি এটি বাদও দিতে পারেন।
-n4আর্গুমেন্ট নম্বর (প্রতি আউটপুট লাইনে ইনপুট আইটেমের সংখ্যা) 4 এ সেট করে।

আউটপুট:

Dog Cat Fish Lizard
Wolf Lion Shark Gecko
Coyote Puma Eel Iguana

অথবা আপনি যদি কোনও জায়গার পরিবর্তে ট্যাবগুলি বিভাজক হিসাবে চান তবে আপনি সেগুলি পরে প্রতিস্থাপন করতে পারেন। তবে, যদি আপনার ইনপুট লাইনে ফাঁকা স্থান থাকে তবে সেগুলি খুব প্রতিস্থাপন করা হবে:

xargs -d '\n' -n4 | tr ' ' '\t'

আউটপুট (ব্রাউজার / টার্মিনালের ট্যাব প্রস্থের উপর নির্ভর করে দেখুন):

Dog Cat Fish    Lizard
Wolf    Lion    Shark   Gecko
Coyote  Puma    Eel Iguana

এই পদ্ধতির সুবিধা রয়েছে যে এটি যুক্তিসঙ্গতভাবে আচরণ করে এমনকি মোট ইনপুট লাইনের সংখ্যা চারটির একাধিক না হলেও।
এলিয়াহ কাগান

3

আপনি এটি ব্যবহার করতে পারেন:

awk -v ORS="" '{print $1; print NR%4==0?"\n":"\t"}' file > file.tsv 

বিল্ট-ইন দুটি ভেরিয়েবলগুলি হ'ল:

  • ORS: হে উতপুত আর ইকর্ড এস ইপরেটর (ডিফল্ট = নিউলাইন)। এটি প্রতিটি মুদ্রণ কমান্ডের শেষে যুক্ত করা হয়।
  • NR: বর্তমান আর ওও এর এন ওমারের প্রক্রিয়া চলছে।

এই কমান্ডটি প্রতিটি লাইনের জন্য প্রথম (এবং এখানে কেবল) কলামের সামগ্রী প্রদর্শন করবে। তারপরে এটি NR4 এর বিভাজনের অবশিষ্ট অংশগুলি পরীক্ষা করে একটি নতুন লাইন বা একটি ট্যাব যুক্ত করার পছন্দ করে ।


3

আর একটি সংক্ষিপ্ততম awkপদ্ধতির:

awk '{printf $0 (NR%4?"\t":"\n")}' infile

এই printf, শুধুমাত্র একটি কলাম পরবর্তী এবং পরবর্তী এবং ... এবং ট্যাবের দ্বারা অনুসৃত \tচরিত্র প্রতিটি পরে কিন্তু হবে printf একটি \newline চরিত্র যখন এন এর আমভের আর ecord এর ফ্যাক্টর ছিল 4 (যেখানে NR%4ফিরে আসবে 0 ) (মিথ্যা যা কি তিন অপারেটর হয় condition(s)?when-true:when-falseকরছে.)


3

এর আমার সমাধানটি হ'ল sedএবং এর সংমিশ্রণটি ব্যবহার করা sed। প্রথমত, আপনি প্রতিটি চতুর্থ রেখাকে কিছু বিশেষ অক্ষর দিয়ে চিহ্নিত করতে পারেন, উদাহরণস্বরূপ >, এই সমাধানটি ব্যবহার করে:

এই ক্ষেত্রে আপনি লাইন 5 থেকে শুরু করতে চান এবং এর পরে প্রতি 4 র্থ লাইন চিহ্নিত করতে চান। জিএনইউতে sedএটি ঠিকানা হিসাবে দেওয়া যেতে পারে 5~4। আপনি এই আদেশটি ব্যবহার করতে পারেন:

sed '5~4s/^/>/' file1 > file2

তারপরে আপনাকে নতুন লাইনগুলি সরিয়ে ফেলতে হবে যা sedলুপের সাহায্যে করা যেতে পারে :

sed ':a;N;s/\n/ /;ba' file2 > file3

নিউলাইনগুলি অন্য কয়েকটি চরিত্রে রূপান্তর করার সহজ উপায় রয়েছে, উদাহরণস্বরূপ tr:

tr '\n' ' ' < file2 > file3

যেভাবেই হোক না কেন, দুটি সংমিশ্রণ দেয়

Dog   Cat   Fish   Lizard   >Wolf   Lion   Shark   Gecko   >Coyote   Puma   Eel   Iguana

( sedসংস্করণটি একটি নতুন পেজ ছেড়ে চলেছে , যদিও trসংস্করণটি না করে)

এর পরে, আপনাকে কেবলমাত্র নতুন লাইনে toোকানো বিশেষ অক্ষরগুলি রূপান্তর করতে হবে; উদাহরণস্বরূপ দেখুন নতুন লাইনগুলি ব্যবহার করতে একটি ট্যাব-সীমিত ফাইলটি রূপান্তর করুন । এই ক্ষেত্রে, >নতুন লাইনে পরিবর্তন করুন:

sed 'y/>/\n/' file3 > outfile

yকমান্ড অনুরূপ tr, অন্য একটি অক্ষর রূপান্তর, কিন্তু আপনি ব্যবহার করতে পারেন sসমানভাবে ভাল এখানে কমান্ড। এর সাথে s, আপনার gপ্রতিটি ম্যাচে লাইনটিতে অপারেশন করা প্রয়োজন ( sed 's/>/\n/g')।

দুটি মধ্যবর্তী ফাইল তৈরির পরিবর্তে আপনি পাইপগুলি ব্যবহার করতে পারেন:

$ sed '5~4s/^/>/' file | sed ':a;N;s/\n/ /;ba' | sed 'y/>/\n/'
Dog Cat Fish Lizard 
Wolf Lion Shark Gecko 
Coyote Puma Eel Iguana

ট্রেলিং স্পেসগুলি যদি সমস্যা হয় তবে এগুলি সরাতে আপনি আরও একটি আদেশ যোগ করতে পারেন:

| sed 's/ $//'

2

"সম্পূর্ণতা" এর জন্য এখানে একটি বিশুদ্ধ বাশ সমাধান রয়েছে:

#!/usr/bin/env bash

sep=$'\t'

while read one \
      && read two \
      && read three \
      && read four
do
  printf "%s\n" "$one$sep$two$sep$three$sep$four"
done

স্পেসগুলি নিয়েও কাজ করে, ধরে নিই IFSসঠিকভাবে সেট করা আছে (এটি এটি ডিফল্টরূপে হওয়া উচিত, এএফাইক)। তদুপরি, আমি মনে করি এটি এমনকি একটি পোর্টেবল শেল স্ক্রিপ্ট হতে পারে এবং কোনও পসিক্স সামঞ্জস্যপূর্ণ শেলের সাথে কাজ করতে পারে।


1
এটি সাধারণভাবে পসিক্সের জন্য উপযুক্ত নয় এমন শেলগুলির কাছে পোর্টেবল নয়, কারণ $' 'উদ্ধৃতি ফর্মটি পসিক্সের প্রয়োজন হয় না। উদাহরণস্বরূপ, ইন dash(যা shউবুন্টুতে ডিফল্টরূপে সরবরাহ করে), printf '%s\n' $'a\tb'কেবল আউটপুট চালায় $a\tb। এর অর্থ এই নয় যে এটি কার্যকর নয়; এটি বাশ কাজ করে। যাইহোক, লোকেদের পোস্ট করা অন্যান্য সমাধানগুলির মতো, ইনপুটটির রেখার সংখ্যা চারটির একাধিক না হলে এটি অসম্পূর্ণ আউটপুট উত্পাদন করে। এছাড়াও, আমি ব্যবহারের পরামর্শ দিচ্ছি read -r, যেহেতু ইনপুট ফাইলটিতে ব্যাকস্ল্যাশ পলায়নের বিষয়টি এখানে প্রত্যাশিত মনে করার কোনও কারণ নেই।
এলিয়াহ কাগন

আপনি কেবল পারেনprintf '%s\t%s\t%s\t%s\n' "$one" "$two" "$three" "$four"
টেরডন

2

একটি ভিম ম্যাক্রো (কিউ দিয়ে রেকর্ড করা) আপনার ক্রিয়াকলাপ প্রয়োগ করতে পারে, তারপরে তিনটি লাইন এড়িয়ে চলে। তারপরে, আপনি কেবল সেই ম্যাক্রো এন বার চালান।

উদাহরণ:

qq $ J i <TAB> <ESC> $ J i <TAB> <ESC> $ J i <TAB> <ESC> ^^ j qq 100 @q

2

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

অনুসন্ধান:

(\w+)[\r\n]+(\w+)[\r\n]+(\w+)[\r\n]+(\w+)[\r\n]+

প্রতিস্থাপন:

\1\t\2\t\3\t\4\n

নিয়মিত প্রকাশের জন্য চেকবক্সটি চিহ্নিত হয়েছে তা নিশ্চিত করুন।

কিভাবে এটা কাজ করে:

প্রথম পদক্ষেপটি হ'ল characters ডাব্লু + সহ শব্দের অক্ষরগুলির একটি সিরিজ সন্ধান করা এবং এক্সপ্রেশনটির চারপাশে প্রথম বন্ধনী আবদ্ধ করে পরিবর্তনশীল \ 1 এ ফলাফলগুলি ক্যাপচার করুন:

(\w+)

এরপরে আমরা লাইন শেষ হওয়া অক্ষরগুলির একটি সিরিজ, \ r এবং \ n, বা সিআর এবং এলএফ অনুসন্ধান করব। যেহেতু উইন্ডোজ ফর্ম্যাটেড ফাইলগুলি উভয়ই ব্যবহার করে, আমরা এই দুটি অক্ষরটিকে বর্গক্ষেত্র বন্ধনীতে মোড়ানো দ্বারা একটি অক্ষর শ্রেণি তৈরি করি। প্লাস এটি এক বা একাধিক অক্ষরের সন্ধান করে:

[\r\n]+

অবশেষে, আমরা প্রতিটি পরবর্তী শব্দটি ভেরিয়েবল \ 2, \ 3 এবং \ 4 এ সঞ্চয় করে আরও 3 বার পুনরাবৃত্তি করি। এটি আমাদের প্রতিস্থাপনকে সহজ করে তোলে। আমাদের কেবলমাত্র আপনার প্রয়োজনীয় ফর্ম্যাটিংয়ের জন্য উপযুক্ত জায়গায় ট্যাব অক্ষর, \ t, এবং একটি নতুন লাইন অক্ষর, to n স্থাপন করতে হবে।

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