কেবল 'ট্র' ব্যবহার করে একাধিক স্পেস প্রতিস্থাপন করুন


71

আমার একটি ফাইল আছে f1.txt:

ID     Name
1      a
2         b
3   g
6            f

জায়গাগুলির সংখ্যা নির্দিষ্ট নয় is কেবল একটি স্থান ব্যবহার করে সমস্ত সাদা স্পেস প্রতিস্থাপনের সর্বোত্তম উপায় কী tr?

আমার এ পর্যন্ত যা আছে:

cat f1.txt | tr -d " "

তবে আউটপুটটি হ'ল:

IDName
1a
2b
3g
6f

তবে আমি এটি দেখতে এটি দেখতে চাই:

ID Name
1 a
2 b
3 g
6 f

চেষ্টা করুন এবং এড়ান sed


6
কেন সেড এড়ানো এত গুরুত্বপূর্ণ? যে কাজ করে ব্যবহার করুন!
ডেভিড রিচার্বি

7
কারণ আমি জানি কীভাবে এটি করতে হয় sed। অন্যান্য উপায় জানতে চেয়েছিলেন:)
gkmohit

উত্তর:


106

এর সাথে tr, sকুইজ পুনরাবৃত্তি বিকল্পটি ব্যবহার করুন :

$ tr -s " " < file
ID Name
1 a
2 b
3 g
6 f

অথবা আপনি একটি awkসমাধান ব্যবহার করতে পারেন :

$ awk '{$2=$2};1' file
ID Name
1 a
2 b
3 g
6 f

আপনি যখন রেকর্ডে কোনও ক্ষেত্র পরিবর্তন করেন, awkপুনর্নির্মাণ করেন $0, সমস্ত ক্ষেত্র নিয়ে যান এবং তাদের একত্রে একত্রিত করে পৃথক করুন OFS, এটি ডিফল্টরূপে একটি স্থান।

এটি স্থান এবং ট্যাবগুলির ক্রমগুলি (এবং সম্ভবত অন্যান্য ফাঁকা অক্ষরগুলি স্থানীয় এবং প্রয়োগের উপর নির্ভর করে awk) এক জায়গায় স্থান করে দেবে, তবে প্রতিটি লাইনের শীর্ষস্থানীয় এবং পিছনের ফাঁকা স্থানগুলিও সরিয়ে ফেলবে।


1
এটিও একটি দুর্দান্ত সমাধান। । । আমি এখন কোনটি বেছে নেব জানি না: / @ জ্ঞানক
gkmohit

আপনার পছন্দসই সমাধান চয়ন করতে নির্দ্বিধায় এবং এটি আপনার জন্য কাজ করে। একটি নোট যে আমার সমাধান @ পলিমের উত্তরের সাথে আলাদা is
cuonglm

1
:)) হ্যাঁ! @ জ্ঞাক এর উত্তরটি সত্যই গতিশীল, কারণ তিনি ব্যবহার করেন awk, তিনি কিছু করতে পারেন। আপনি তার সমাধান গ্রহণ করতে পারেন। কেবল একটি জিনিস: জিনুক আপনি সম্ভবত ব্যাখ্যা করতে পারেন যে আপনার আদেশে অ্যাজক ফর্ম্যাটটি কী করে? এছাড়াও আপনি কী ট্যাব / স্পেস যুক্ত করতে পারেন যাতে আউটপুটটি অজানা এর প্রত্যাশিত আউটপুটটির সাথে সঙ্গতিপূর্ণ হয়?
পলিম

1
@ পলিম: অজানা এর শেষ সম্পাদনা সহ, তিনি কেবল একটি স্থান চান বলে মনে হয়, আউটপুট যেমন column -tকরেন না। এর জন্য ব্যাখ্যা যুক্ত করুন awk
cuonglm

4
এখানে একটি ছোট পার্থক্য আছে। trএকটি একক স্পেস সহ একটি লাইনের শেষে দুটি স্পেস প্রতিস্থাপন করবে। awkসমস্ত চলমান স্থান সরিয়ে ফেলবে।
অ্যান ভ্যান রসুম

19

শুধু ব্যবহার করুন column:

column -t inputFile

আউটপুট:

ID  Name
1   a
2   b
3   g
6   f

আশ্চর্যজনক এবং একটি দ্রুত উত্তর :)
gkmohit

1
@ অজানা গ্রেট সেবার হতে :)!
পলিম

1
@ জ্ঞাক ওয়াও কুল, কলামও একটি ফাইলকে যুক্তি হিসাবে গ্রহণ করে। সুন্দর ধন্যবাদ!
পলিম

আমি চাইলে দ্বিতীয় কলামটি কীভাবে পাব? আমি চেষ্টা করেছিলাম column -t f1.txt | cut -d " " -f2 তবে আমার প্রত্যাশিত সমাধানটি ছিল না
gkmohit

2
তারপরেও column -t file | awk '{print $2}'
বিশ্রী

8

আপনি যদি "সাদা স্থান" চেপে দেখতে চান তবে আপনি ট্র এর প্রাক-সংজ্ঞায়িত অক্ষর সেটগুলি ব্যবহার করতে চান ": ফাঁকা:" (অনুভূমিক সাদা স্থান ট্যাব এবং স্পেস) বা ": স্থান:" (ভার্চুয়াল হোয়াইটস্পেস):

/bin/echo -e  "val1\t\tval2   val3" | tr -s "[:blank:]"

উদাহরণগুলি রেড হ্যাট 5 (GNU টিআর) এ চালানো হয়েছিল।

আমার ক্ষেত্রে আমি সমস্ত শ্বেত স্পেসকে একটি একক জায়গায় স্বাভাবিক করতে চেয়েছিলাম যাতে আমি একটি দালাকার হিসাবে স্থানের উপর নির্ভর করতে পারি।

ডাস্ট্রবুবু'র দ্বিতীয় মন্তব্যে চিহ্নিত হিসাবে আমি ম্যান পৃষ্ঠাতে শব্দটি মিস করেছি:

 -s uses the last specified SET, and occurs after translation or deletion.

এটি আমাদের প্রথম টিআরটি অপসারণ করতে দেয়। আমার ঘনত্বের মুখে তার ধৈর্য ধরে কুডো স্কট করতে হবে।

এর আগে, রেডিস কনফিগারেশন থেকে পোর্ট পার্সিং করছে। ফাইল:

grep "^port" $redisconf | tr "[:blank:]" " " | tr -s "[:blank:]"  | cut -d" " -f2

এরপরে, এসইটি 2 সংক্ষেপের সাথে নির্দিষ্ট করা হবে:

grep "^port" $redisconf | tr -s "[:blank:]" " " | cut -d" " -f2

আউটপুট:

6379

সাদা স্থানের সংক্ষিপ্তসারগুলি সম্পর্কে আরও বিশদের জন্য

[: ফাঁকা:] অক্ষর শ্রেণীর অন্তর্ভুক্ত যখন ক্রমাগত মিশ্র অক্ষরগুলি অন্তর্ভুক্ত থাকে তখন যেখানে একা চেঁচিয়ে ফেলুন তা প্রদর্শন করুন:

 /usr/bin/printf '%s \t %s' id myname | tr -s "[:blank:]"  | od -cb
0000000   i   d      \t       m   y   n   a   m   e
        151 144 040 011 040 155 171 156 141 155 145
0000013

দ্রষ্টব্য: প্রিন্টফ ফর্ম্যাটে আমার দুটি স্ট্রিং ফিল্ডগুলি 1 স্পেস, 1 ট্যাব, 1 স্পেস দ্বারা পৃথক করা হয়েছে। চেপে যাওয়ার পরে এই ক্রমটি এখনও বিদ্যমান। অক্টাল ডাম্পের আউটপুটে এটি ascii ক্রম 040 011 040 দ্বারা প্রতিনিধিত্ব করা হয়।


1
আপনার কি সত্যিই দরকার tr "[:blank:]" " " | tr -s "[:blank:]"? আমি অনুমান করি প্রথম অংশটি যথেষ্ট হবে, tr "[:blank:]" " "যেহেতু এটি শ্বেতক্ষেত্রকে স্বাভাবিক করে তোলে এবং ইতিমধ্যে প্রতিস্থাপনটি করে। ম্যান পৃষ্ঠা থেকে: "অক্ষরের একাধিক উপস্থিতিগুলি চিহ্নিত করুন [...] সমস্ত মোছা এবং অনুবাদ শেষ হওয়ার পরে এটি ঘটে occurs"
দস্তরোবু

2
সুতরাং -tr -s "[: ফাঁকা:]" "" ´ এটি করা উচিত এটি প্রথমে সমস্ত ফাঁকা স্থানগুলিতে অনুবাদ করে এবং তারপরে স্পেসগুলি সঙ্কুচিত করে। দ্বিতীয় ´tr´ এর দরকার নেই ´
দস্তরোবু

1
আমি চেষ্টা করেছি printf 'ID \t Name\n' | tr -s "[:blank:]" " " | od -cb(@ ডাস্ট্রোবু দ্বারা প্রস্তাবিত) এবং আউটপুট হিসাবে আমি ID Name\n( একটি স্থান দিয়ে) পেয়েছি । আপনি কি সত্যিই এটি ব্যবহার করে দেখেছেন, @ user3183018?
স্কট

1
ঠিক আছে, আমাকে এই আবার বলার চেষ্টা করুন। আমি printf 'ID␣\t␣Name\n' | tr -s "[:blank:]" "␣"  (ডাস্ট্রবুবু দ্বারা প্রস্তাবিত) করেছি, যেখানে একটি স্থান প্রতিনিধিত্ব করে, এবং আমি ID␣Name\nআউটপুট হিসাবে (একটি স্থান সহ) পেয়েছি । আমি প্রশ্ন থেকে শিরোনামের স্ট্রিংগুলি ব্যতীত এটি "পোর্ট <SPACE> <TAB> <SPACE> 6379" এর আপনার উদাহরণের মতোই । আমি ভাবছি আপনি চেষ্টা করেছেন কিনা  tr -s "[:blank:]"(চূড়ান্ত "␣"যুক্তি ব্যতীত)।
স্কট

1
যখন আমি করি printf 'ID \t Name\n' | od -cb, এটি ঠিক কীটি অনুমিত হবে তা দেখায়: ID ⁠  \t ⁠  N a m e \n(অর্থাত্  ID 040 011 040 N a m e\n)। এদিকে, আপনার নিজের প্রমাণ অনুসারে, আপনি ঠিক ত্রুটিটিই করছিলেন যে আমি অনুমান করেছিলাম যে আপনি ছিলেন: আপনি @ দস্তরোবু এবং আমি এখন চারবার উপস্থাপনের আদেশের পরিবর্তে দৌড়াদৌড়ি করছেন tr -s "[:blank:]"(অর্থাত্  trএকটি বিকল্প এবং  একটি যুক্তি দিয়ে): tr -s '[:blank:]' '␣'(অর্থাত,  trএকটি বিকল্প এবং  দুটি যুক্তি সহ )
স্কট

5

কার প্রোগ্রাম (শেল ব্যতীত) দরকার?

while read a b
do
    echo "$a $b"
done < f1.txt

পলিমের columnউত্তরের মতো আপনি যদি দ্বিতীয় কলামের মানগুলি লাইন আপ করতে চান তবে এর printfপরিবর্তে ব্যবহার করুন echo:

while read a b
do
    printf '%-2s %s\n' "$a" "$b"
done < f1.txt

1
প্রথম স্থানে, যখন টিআর এর সাথে তুলনা করা হয় - এটি একটি মারাত্মকভাবে দুর্বল পরামর্শ দক্ষতা অনুসারে যদি ইনপুটটি খুব ছোট না হয় তবে তার অনুরোধের ক্ষুদ্র ব্যয়কে ছাড়িয়ে যায় tr- এটি লিখতে আরও কত বেশি কাজ নেয় তা উল্লেখ করার দরকার নেই। সর্বশেষে, আপনি কি বলবেন না যে এই পোস্টটি আসলে জিজ্ঞাসিত প্রশ্নের উত্তর দেয় না? কেবল একটি ট্র ব্যবহার করে একটি সাদা জায়গা দিয়ে সমস্ত সাদা স্পেস প্রতিস্থাপনের সবচেয়ে ভাল উপায় কী?
মাইকজার্ভ

1
এবং পাশাপাশি - আপনি আরও সহজে কিছু দিয়ে কিছু করতে পারেন না $IFS? হয়তো পছন্দ: IFS=' <tab>' set -f ; echo $(cat <file)?
মাইকসার্ভ

2

এটি একটি পুরানো প্রশ্ন এবং বহুবার সমাধান হয়েছে। কেবলমাত্র সম্পূর্ণতার জন্য: আমার একটি সিমিলার ইস্যু ছিল, তবে পাইপ দিয়ে অ্যান্টোর প্রোগ্রামে লাইনগুলি পাস করতে চেয়েছিলাম। আমি xargs ব্যবহার ।

-L max-lines
   Use at most max-lines nonblank input lines per command line.
   Trailing blanks cause an input line to be logically continued 
   on the next input line.  Implies -x.

তাই cat f1.txt | xargs -L1আপনি যা চান আউটপুট মনে হয়।

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