বিড়াল কমান্ড থেকে প্রথম এক্স অক্ষর পেতে?


42

আমার শেল স্ক্রিপ্টের একটি ভেরিয়েবলে আউটপুট করছি এমন একটি টেক্সট ফাইল রয়েছে have আমার তবে প্রথম 50 টি অক্ষর প্রয়োজন।

আমি চেষ্টা করেছি cat ${filename} cut -c1-50কিন্তু আমি প্রথম 50 টি চরিত্রের চেয়ে অনেক বেশি পাচ্ছি? এটি cutলাইনগুলি অনুসন্ধানের কারণে হতে পারে (100% নিশ্চিত নয়), যখন এই পাঠ্য ফাইলটি একটি দীর্ঘ স্ট্রিং হতে পারে - এটি সত্যই নির্ভর করে।

catকমান্ড থেকে প্রথম এক্স অক্ষর পেতে পাইপ করতে পারি সেখানে কি কোনও ইউটিলিটি আছে ?


10
তুমি কি ভুলে গেছ |? cat ${filename} | cut -c1-50
ডিসপ্লেনাম

@ ডিসপ্লেনাম স্থির হয়েছে, আমার পুনর্নির্মাণের ত্রুটিটি ধরার জন্য ধন্যবাদ।
jkj2000

1
@ jkj2000, আসল প্রশ্নটি হওয়ায় আমি পুরানো সংস্করণে ফিরে এসেছি।
রমেশ

উত্তর:


61
head -c 50 file

এটি প্রথম 50 বাইট ফেরত দেয়।

মনে রাখবেন যে কমান্ডটি সবসময় সমস্ত ওএসে একই প্রয়োগ হয় না। লিনাক্স এবং ম্যাকোস এ এটি আচরণ করে। সোলারিসে (11) আপনাকে / usr / gnu / bin / এ gnu সংস্করণ ব্যবহার করতে হবে


মাথা কোন -cবিকল্প নেই। আমি পরিবর্তে ডিডি (1) যেতে হবে।
মীরাবিলোস

7
নোট করুন যে এই উত্তরটি ধরে নিয়েছে যে ফাইলটিতে কেবল ASCII অক্ষর রয়েছে, যেমন ওপি প্রথম এক্স অক্ষরগুলি চেয়েছিল, বাইটগুলি নয়।
ক্যালিমো

2
@ মীরাবিলোস এটি পোর্টেবল নাও হতে পারে তবে আমার সংস্করণটি ( GNU coreutils 5.97) করে।
ইওসোরিয়ান

1
পসিক্স -cএকটি বৈধ বিকল্প হিসাবে সংজ্ঞা দেয় না , তবে এটি অবশ্যই আপনার স্থানীয় পরিবেশের উপর নির্ভরশীল। unix.com/man-page/posix/1/head
জুলাই

1
@ ক্যালিমো হ্যাঁ, আমি জানি, তবে আমি আমার কমান্ডটি চালিয়ে 100 টি অক্ষর দিয়ে একটি পাঠ্য ফাইল তৈরি করার চেষ্টা করেছি এবং এটি 50 টি অক্ষর মুদ্রিত করেছে। তবে আপনি ASCII সম্পর্কে ঠিক বলেছেন তবে যেহেতু ওপি উত্তর হিসাবে এটি প্রতীকী হয়েছে সেহেতু তার ক্ষেত্রে কেউ নেই।
ডিসপ্লেনেম

27

cutআপনি যদি কোনও পাইপ এতে ডেটা পাঠাতে ব্যবহার করেন তবে আপনার আদেশটি কাজ করবে:

cat ${file} | cut -c1-50 

বা, বিড়ালের অকেজো ব্যবহার এড়ানো এবং এটিকে কিছুটা নিরাপদ করে তোলা:

cut -c1-50 < "$file"

নোট করুন যে উপরের কমান্ডগুলি প্রতিটি ইনপুট লাইনের প্রথম 50 টি অক্ষর (বা আপনার cutপ্রয়োগের উপর নির্ভর করে বাইটস ) মুদ্রণ করবে । এটি যেমনটি আপনি প্রত্যাশা করেন তা করা উচিত, যেমন আপনি বলেছেন, আপনার ফাইলটি একটি বিশাল লাইন।


8
dd status=none bs=1 count=50 if=${filename}

এটি প্রথম 50 বাইট ফেরত দেয়।


ডিডির কোনও status=noneপতাকা নেই। 2>/dev/nullপরিবর্তে ব্যবহার করুন (এবং সঠিকভাবে উদ্ধৃতি): dd if="$filename" bs=1 count=50 2>/dev/null(তবুও, bs=50 count=1জড়িত সাইকেলের সংখ্যা হ্রাস করতে ব্যবহার বিবেচনা করুন )।
মীরাবিলো

1
status=noneউবুন্টু ১৪.০৪, কোরিউটিলস ৮.২১ ব্যবহার করার সময় @ মীরাবিলোস ডিডি-র রয়েছে তবে আপনি 2>/dev/nullপূর্ববর্তী সংস্করণ ব্যবহার করা ঠিক হবে না ।
didal24

1
@ মিরাবিলোস বেশিরভাগ লিনাক্স ফ্রিবিএসডি এবং অন্যান্য বিএসডি-তে জিএনইউ কোর্টিল ব্যবহার করে। এটি সোলারিসে প্যাকেজ gnu-coreutils হিসাবে উপলব্ধ। হ্যাঁ, এটি "ইউনিক্স এবং লিনাক্স" এবং ইউনিক্স এবং লিনাক্স উভয়ই সিস্টেম জিএনইউ কোর্টিল ব্যবহার করে।
didal24

2
না, ইউনিক্স সিস্টেমগুলি সাধারণত জিএনইউ ইউটিলিটিগুলি ব্যবহার করে না। এমনকি জিএনইউ "জিএনইউ ইউনিক্স নয়" এর একটি সংক্ষিপ্ত রূপ। দয়া করে পোর্টেবল সমাধানগুলিতে আটকে থাকুন, বা, আপনাকে অবশ্যই জিএনইউ-কেবল সমাধান দিতে হবে , তাই বলুন এবং যদি সম্ভব হয় তবে একটি সমপরিমাণ পোর্টেবল সমাধান দেখান।
মীরাবিলো

1
কঠোরভাবে বলতে গেলে, এটি read()50 বাইটের মধ্যে একটি করে। fileউদাহরণস্বরূপ যদি পাইপ হয় এবং সেই সময়ে কম অক্ষর পাওয়া যায় তবে কম বাইটগুলি ফিরে আসবে। এর সমতুল্য হওয়ার জন্য head -c50আপনাকে জিএনইউ নির্দিষ্ট ব্যবহার করতে হবে iflag=fullblock
স্টাফেন চেজেলাস

4

এখনও অবধি বেশিরভাগ উত্তর ধরে নিয়েছে যে 1 বাইট = 1 অক্ষর, আপনি যদি একটি অ-এসসিআইআই লোকেল ব্যবহার করেন তবে তা নাও হতে পারে।

এটি করার আরও কিছুটা শক্তিশালী উপায়:

testString=$(head -c 200 < "${filename}") &&
  printf '%s\n' "${testString:0:50}"

নোট করুন যে এটি ধরে নেয়:

  1. আপনি ব্যবহার করছেন ksh93, bash(অথবা সাম্প্রতিক zshবা mksh(যদিও সমর্থিত একমাত্র মাল্টি-বাইট চার্সেটটি mkshইউটিএফ -8 এবং কেবলমাত্র পরে set -o utf8-mode)) এবং এর একটি সংস্করণ headসমর্থন করে -c(বেশিরভাগ আজকাল করেন তবে কঠোরভাবে মানক নয়)।
  2. বর্তমান লোকেলটি ফাইলের মতো একই এনকোডিংয়ে সেট করা হয়েছে (টাইপ করুন locale charmapএবং file -- "$filename"এটি পরীক্ষা করতে); যদি না হয় তবে এটির সাথে সেট করুন। LC_ALL=en_US.UTF-8)
  3. আমি headসবচেয়ে খারাপ ক্ষেত্রে ইউটিএফ -8 ধরে রেখে ফাইলটির প্রথম 200 বাইট নিয়েছি যেখানে সমস্ত অক্ষর সর্বাধিক 4 বাইটে এনকোড করা আছে। এটি আমি ভাবতে পারি এমন বেশিরভাগ ক্ষেত্রে coverেকে রাখা উচিত।

অবশ্যই, এটি জিএনইউ headবা এটির একটি অন্য বাস্তবায়নও গ্রহণ করে যা উত্তর-মান -cবিকল্পটি যুক্ত করে। তবে আপনি ইতিমধ্যে GNU ব্যাশ প্রয়োজন। (দ্রষ্টব্য: mksh'ইউটিএফ -8 মোডটি ইউটিএফ -8 এনকোডযুক্ত ফাইলগুলির জন্য এটি করতে পারে)) আমি ওপিকে জিজ্ঞাসা করব যদি তাদের অক্টেট বা মাল্টিবাইট অক্ষর প্রয়োজন, কেবল "অক্ষরগুলি" একটি অস্পষ্ট / জিনেরিক শব্দ।
মীরাবিলোস

এটিও ধরে নেয় $filenameবা $testStringফাঁকা নিউলাইন বা ওয়াইল্ডকার্ড ধারণ করে না বা এর সাথে শুরু করে না -
স্টাফেন চেজেলাস

${var:offset:length}কনস্ট্রাক্ট আপনি এখানে ব্যবহার করছেন আসলে থেকে আসে ksh93এবং সাম্প্রতিক সংস্করণ দ্বারা সমর্থিত zsh( zshনিজস্বতা আছে $testString[1,50])। আপনি প্রয়োজন ${testString:0:50} মধ্যে ksh93এবং zshঅবশ্য।
স্টাফেন চেজেলাস

উপরের মন্তব্যগুলিকে
সম্বোধন

2
grep -om1 "^.\{50\}" ${filename}

অন্যান্য বৈকল্পিক (ফাইলের প্রথম লাইনের জন্য)

(IFS= read -r line <${filename}; echo ${line:0:50})

এটি উচ্চ-স্তরের সরঞ্জামগুলির অপব্যবহার - এবং আপনি যা চান তা না করার প্রবণতা, উদাহরণস্বরূপ যদি তারা স্থানীয়-সচেতন হয়।
মীরাবিলো

@ মীরাবিলোস উচ্চ-স্তরের সরঞ্জামগুলির অধীনে আপনার অর্থ কী : readএবং echo? নাকি bash expansion?
কস্টাস

grep(regexp), এবং হ্যাঁ, এখানে শেলের ব্যবহার (ইঙ্গিত: প্রথম লাইনটি বড় হতে পারে)। (বলা হচ্ছে, বাশিজমও পসিক্সে নেই, তবে বেশিরভাগ শাঁস
এটিকে

0

১. এএসসিআইআই ফাইলগুলির জন্য, @ ডিসপ্লেনাম বলেছেন:

head -c 50 file.txt

উদাহরণস্বরূপ, file.txt এর প্রথম 50 টি অক্ষর মুদ্রণ করবে।

২. বাইনারি ডেটার জন্য, hexdumpএটি হেক্স চর হিসাবে মুদ্রণ করতে ব্যবহার করুন :

hexdump -n 50 -v file.bin

উদাহরণস্বরূপ, ফাইল.বিনের প্রথম 50 বাইট প্রিন্ট করবে।

মনে রাখবেন যে -vভার্বোস বিকল্প ব্যতীত, hexdumpপুনরাবৃত্ত লাইনগুলি *পরিবর্তে একটি নক্ষত্র ( ) দিয়ে প্রতিস্থাপন করবে । এখানে দেখুন: https://superuser.com/questions/494245/what-does-an-asterisk-mean-in-hexdump-output/494613#494613


-2

আপনি এর জন্য সেড ব্যবহার করতে পারেন যা সমস্যাটিকে খুব সহজেই মোকাবেলা করবে

sed -e 's/^\(.\{50\}\).*/\1/' yourfile

ওপির প্রশ্নটি সমাধান করলে এটি কীভাবে হ্রাস পেয়েছে তা জানতে আগ্রহী: "আমার কেবল প্রথম 50 টি চরিত্রের প্রয়োজন" এটি ইউইওসি (বিড়ালের
ব্যবহারহীন

1
এই উত্তরটি ফাইলের প্রতিটি পংক্তির প্রথম পঞ্চাশটি অক্ষর দেয় কেবল ফাইলের প্রথম 50 টি নয়। সমস্ত লাইন 50 টিরও কম অক্ষরের চেয়ে বেশি কিছু ছাপবে না। আপনার সমাধানটি আরও ভালভাবে কাজ করবেsed -n -e '1s/^\(.\{50\}\).*/\1/p' ${filename}
didal24

বোঝা মাত্র হতে পারে: মাথা -n 1 | sed -e 's / ^ (। \ {50 \})। * / \ 1 /' ... এবং এটি সমস্যার সমাধান করতে পারত। ওপি বলেছেন: "কেবল প্রথম 50 টি চরিত্রের প্রয়োজন"
মুন্কিওটো

1
নাঃ। যদি প্রথম লাইনটি কেবল 49 টি অক্ষর দীর্ঘ হয় তবে এটি কিছুই দেয় না।
didal24

ডগ আমি এই প্রথম বুঝতে পেরেছিলাম তবে ওপিতে মুদ্রণের বিষয়ে কিছুই উল্লেখ করা হয়নি যদি লাইনে 50 টিরও কম অক্ষর থাকে, তাই আমি এখনও আপনার বক্তব্যটি দেখতে ব্যর্থ হই না, আবার এই বিষয়টি আবারও নিম্নচ্যুত হওয়ায় এটি আবার কী কারণে কাজ করবে তা পড়ে যায় into মাথা: মাথা -n 1 $ name ফাইলের নাম} | sed -n -e '1s / ^ (। \ {50 \})। * / \ 1 / পি'
মুনকীটো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.