'কাটা' কমান্ডটি কীভাবে একই পর্যায়ক্রমিক সীমানারকে একই হিসাবে ব্যবহার করবে?


307

আমি কলাম-ভিত্তিক, 'স্পেস'-সমন্বিত পাঠ্য স্ট্রিম থেকে একটি নির্দিষ্ট (চতুর্থ) ক্ষেত্রটি বের করার চেষ্টা করছি। আমি cutনিম্নলিখিত পদ্ধতিতে কমান্ডটি ব্যবহার করার চেষ্টা করছি :

cat text.txt | cut -d " " -f 4

দুর্ভাগ্যক্রমে, cutএকাধিক স্পেসকে একটি সীমানা হিসাবে বিবেচনা করে না। আমি আঁতকে দিয়ে পাইপ করতে পারতাম

awk '{ printf $4; }'

বা সেড

sed -E "s/[[:space:]]+/ /g"

স্পেসগুলি ধসে পড়তে হবে, তবে আমি জানতে চাই যে cutস্থানীয়ভাবে বেশ কয়েকটি সীমানা লেনদেন করার উপায় আছে কিনা ?



উত্তর:


545

চেষ্টা করুন:

tr -s ' ' <text.txt | cut -d ' ' -f4

থেকে trমানুষের পৃষ্ঠা:

-s, - স্কুইজ-পুনরাবৃত্তি একটি পুনরাবৃত্ত অক্ষরের প্রতিটি ইনপুট অনুক্রম প্রতিস্থাপন করে
                        যেটি একক ঘটনার সাথে SET1 এ তালিকাভুক্ত
                        যে চরিত্রের

24
catএখানে প্রয়োজন নেই। আপনি < text.txtসরাসরি যেতে পারে tren.wikipedia.org/wiki/Cat_%28Unix%29#Useless_use_of_cat
arielf

1
এটি যে কোনও সরল তা নিশ্চিত নয়, তবে আপনি মার্জ করতে চলেছেন, আপনি কাটগুলি ছেড়ে যেতে পারেন -dএবং একাধিক অক্ষর থেকে সরাসরি ট্যাবে অনুবাদ করতে পারেন । উদাহরণস্বরূপ: আমি এখানে আমার ডিসপ্লেটি স্বয়ংক্রিয়ভাবে রফতানি করার জন্য একটি উপায় খুঁজতে এসেছি:who am i | tr -s ' ()' '\t' | cut -f5
লিও

এটি অজানা সমাধানের বিপরীতে লিডিং / ট্রেলিং হোয়াইটস্পেসটি সরিয়ে দেয় না (যা সম্ভবত প্রয়োজন ছিল না তবে হতে পারে না) usually অজানা সমাধানটি আরও অনেক বেশি পঠনযোগ্য এবং কম ভার্বোস।
n.caillou

-1 সতর্কতা: এটি যথাযথ বিতরণকারীদের এক হিসাবে প্রশিক্ষণ হিসাবে একই জিনিস নয়। তুলনা করুন echo "a b c" | cut -d " " -f2-,echo "a b c" | tr -s " " | cut -d " " -f2-
user541686

96

আপনি আপনার প্রশ্নে মন্তব্য হিসাবে, awkসত্যিই যাওয়ার উপায়। কেভের উত্তরগুলি দেখায় , স্পেসগুলি ফাঁক করে cutএকসাথে ব্যবহার করা সম্ভব ।tr -s

যাইহোক আমাকে ভবিষ্যতের পাঠকদের জন্য সমস্ত সম্ভাব্য সংমিশ্রণটি দিয়ে যেতে দিন। ব্যাখ্যাগুলি টেস্ট বিভাগে রয়েছে।

tr | কাটা

tr -s ' ' < file | cut -d' ' -f4

awk

awk '{print $4}' file

সজোরে আঘাত

while read -r _ _ _ myfield _
do
   echo "forth field: $myfield"
done < file

sed

sed -r 's/^([^ ]*[ ]*){3}([^ ]*).*/\2/' file

টেস্ট

এই ফাইলটি দেওয়া হয়েছে, আসুন কমান্ডগুলি পরীক্ষা করুন:

$ cat a
this   is    line     1 more text
this      is line    2     more text
this    is line 3     more text
this is   line 4            more    text

tr | কাটা

$ cut -d' ' -f4 a
is
                        # it does not show what we want!


$ tr -s ' ' < a | cut -d' ' -f4
1
2                       # this makes it!
3
4
$

awk

$ awk '{print $4}' a
1
2
3
4

সজোরে আঘাত

এটি ক্ষেত্রগুলি ক্রমানুসারে পড়ে। ব্যবহার করে _আমরা ইঙ্গিত দিয়েছি যে এই ক্ষেত্রগুলি উপেক্ষা করার জন্য এটি "জাঙ্ক ভেরিয়েবল" হিসাবে নিক্ষেপযোগ্য ভেরিয়েবল। এইভাবে, আমরা $myfieldফাইলের মধ্যে 4 র্থ ক্ষেত্র হিসাবে সংরক্ষণ করি, তাদের মধ্যে ফাঁকা স্থান নির্বিশেষে।

$ while read -r _ _ _ a _; do echo "4th field: $a"; done < a
4th field: 1
4th field: 2
4th field: 3
4th field: 4

sed

এই জায়গার তিনটি গ্রুপ এবং কোন শূন্যস্থান ক্যাচ ([^ ]*[ ]*){3}। তারপরে, এটি 4 র্থ ক্ষেত্র হিসাবে স্পেস পর্যন্ত যা কিছু আসবে তা ধরে রাখে, এটি শেষ পর্যন্ত মুদ্রিত হয় \1

$ sed -r 's/^([^ ]*[ ]*){3}([^ ]*).*/\2/' a
1
2
3
4

2
awkএটি কেবল মার্জিত এবং সহজই নয়, এটি ভিএমওয়্যার ইএসএক্সিতে অন্তর্ভুক্ত রয়েছে, যেখানে trঅনুপস্থিত।
ব্যবহারকারী 121391

2
@ ব্যবহারকারী 121391 ব্যবহারের আর একটি কারণ awk!
ফেডরকিই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'

@ ফেডরকিই আমি আন্ডারস্কোরটি "জাঙ্ক ভেরিয়েবল" হিসাবে কখনও শুনিনি। আপনি কি এই সম্পর্কে আরও অন্তর্দৃষ্টি / রেফারেন্স দিতে পারেন?
ব্রিকান

1
@ ব্রাইকান আমি গ্রেগের মধ্যে এটি সম্পর্কে শিখেছি কীভাবে আমি কোনও ফাইল (ডেটা স্ট্রিম, ভেরিয়েবল) লাইন বাই লাইন (এবং / অথবা ক্ষেত্রের বাইরের ক্ষেত্র) পড়তে পারি? : কিছু লোক ক্ষেত্র উপেক্ষা করতে "জাঙ্ক ভেরিয়েবল" হিসাবে নিক্ষেপযোগ্য পরিবর্তনশীল _ ব্যবহার করে। এটি (বা প্রকৃতপক্ষে কোনও পরিবর্তনশীল) একক readকমান্ডেও একাধিকবার ব্যবহার করা যেতে পারে , যদি এটির মধ্যে কী প্রবিষ্ট হয় তা যদি আমাদের যত্ন না করে । এটা তোলে কিছু হতে পারে, এটা ঠিক যে এটা একরকম পরিবর্তে সাধারণ ছিল junk_varবা whatever:)
'তাই স্টপ ক্ষতি' fedorqui

25

সংক্ষিপ্ত / বন্ধুত্বপূর্ণ সমাধান

অনেকগুলি সীমাবদ্ধতার সাথে হতাশ হয়ে যাওয়ার পরে cut, আমি আমার নিজের প্রতিস্থাপনটি লিখেছিলাম, যা আমি cuts"স্টেরয়েড কাট" করার জন্য বলেছিলাম ।

কাটগুলি সম্ভবত এটি এবং অন্যান্য অনেকগুলি সম্পর্কিত কাট / পেস্ট সমস্যারসর্বাধিক সংক্ষিপ্ততম সমাধানটি দেয়।

একটি উদাহরণ, অনেকের মধ্যে এই বিশেষ প্রশ্নে সম্বোধন করা:

$ cat text.txt
0   1        2 3
0 1          2   3 4

$ cuts 2 text.txt
2
2

cuts সমর্থন করে:

  • ফাইলগুলিতে সর্বাধিক সাধারণ ফিল্ড-ডিলিমিটারগুলির স্বতঃ-সনাক্তকরণ (+ ডিফল্টকে ওভাররাইড করার ক্ষমতা)
  • মাল্টি-চর, মিশ্র-চর এবং রিজেক্স মিলে ডিলিমিটারগুলি
  • মিশ্র ডিলিমিটারগুলির সাথে একাধিক ফাইল থেকে কলামগুলি বের করা
  • লাইনের শুরু ছাড়াও লাইনের শেষে থেকে (নেতিবাচক সংখ্যা ব্যবহার করে) অফসেটগুলি
  • কলামগুলি স্বয়ংক্রিয়ভাবে পাশাপাশি আটকানো ( pasteআলাদাভাবে ডাকার দরকার নেই )
  • ক্ষেত্র পুনঃক্রমের জন্য সমর্থন
  • একটি কনফিগার ফাইল যেখানে ব্যবহারকারীরা তাদের ব্যক্তিগত পছন্দগুলি পরিবর্তন করতে পারেন
  • ব্যবহারকারী বন্ধুত্বপূর্ণতা এবং ন্যূনতমবাদী প্রয়োজনীয় টাইপিংয়ের উপর দুর্দান্ত জোর

এবং আরো অনেক কিছু. যার কোনটিই স্ট্যান্ডার্ড দ্বারা সরবরাহ করা হয়নি cut

আরও দেখুন: https://stackoverflow.com/a/24543231/1296044

উত্স এবং ডকুমেন্টেশন (ফ্রি সফটওয়্যার): http://arielf.github.io/cuts/


4

এই পার্ল এক-লাইনার দেখায় যে পার্ল কতটা ঘনিষ্ঠভাবে সম্পর্কিত ছিল:

perl -lane 'print $F[3]' text.txt

যাইহোক, @Fঅটোস্প্লিট অ্যারে সূচীতে শুরু হয় $F[0]যখন অ্যাজকি ক্ষেত্রগুলি শুরু হয়$1


3

cutআমার জানা সংস্করণগুলি সহ , না, এটি সম্ভব নয়। cutপ্রাথমিকভাবে ফাইল পার্সিংয়ের জন্য দরকারী যেখানে বিভাজক সাদা স্থান নয় (উদাহরণস্বরূপ /etc/passwd) এবং এতে নির্দিষ্ট সংখ্যক ক্ষেত্র রয়েছে। এক সারিতে দুটি বিভাজকের অর্থ একটি খালি ক্ষেত্র এবং এটি হোয়াইটস্পেসের ক্ষেত্রেও যায়।

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