এক লাইনে আউটপুট একাধিক লাইন একত্রিত কিভাবে?


158

আমি যদি কমান্ডটি চালিত করি তবে আমি cat file | grep patternআউটপুটটির অনেক লাইন পাই। আপনি কিভাবে এক লাইন সব লাইন কনক্যাটেনেট না, কার্যকরভাবে প্রতিটি প্রতিস্থাপন "\n"সঙ্গে "\" "(শেষ সঙ্গে "স্থান দ্বারা অনুসরণ)?

cat file | grep pattern | xargs sed s/\n/ /g আমার পক্ষে কাজ করছে না


উপায় দ্বারা: (1) আপনার sedস্ক্রিপ্টটি একক-কোটায় রাখার প্রয়োজন যাতে বাশ এতে বিচলিত না হয় (যেহেতু দুটি আর্গুমেন্ট সহ sed s/\n/ /gকল এবং ); (2) যেহেতু আপনি আউটপুট চান হতে ইনপুট করতে , না আর্গুমেন্ট থেকে , আপনি নিষ্কাশন প্রয়োজন ; এবং (3) এখানে কোনও প্রয়োজন নেই, যেহেতু কোনও ফাইল নাম এটির দ্বিতীয় যুক্তি হিসাবে গ্রহণ করতে পারে। সুতরাং, আপনার চেষ্টা করা উচিত ছিল । (এই ক্ষেত্রে এটি উপরের লিঙ্কটি দেওয়া কারণের জন্য কাজ করতো না, কিন্তু এখন আপনি যদি ভবিষ্যতে জানি।)seds/n//gcat file | grep patternsedsedxargscatgrepgrep pattern file | sed 's/\n/ /g'
ruakh


68 টি ভোট (140k মতামত) সহ প্রশ্নটি এমন পোস্টের সাথে সদৃশ যা কেবলমাত্র 1 টি ভোট (12 কে ভিউ)? এটা ঠিক নয়
কেনোরব

উত্তর:


231

tr '\n' ' 'সমস্ত নিউলাইন অক্ষর ফাঁকা জায়গায় অনুবাদ করতে ব্যবহার করুন :

$ grep pattern file | tr '\n' ' '

দ্রষ্টব্য: grepফাইলগুলি পড়ে, ফাইলগুলি catসংঘবদ্ধ করে। না cat file | grep!

সম্পাদনা:

trকেবলমাত্র একক অক্ষরের অনুবাদগুলি পরিচালনা করতে পারে। আপনি যেমন awkআউটপুট রেকর্ড বিভাজক পরিবর্তন করতে ব্যবহার করতে পারেন:

$ grep pattern file | awk '{print}' ORS='" '

এটি রূপান্তরিত হবে:

one
two 
three

প্রতি:

one" two" three" 

3
আপনি এই পদ্ধতির সাথে শেষে একটি অনাকাঙ্ক্ষিত স্থান দিয়ে শেষ করুন।
সোরিন

1
আপনি যোগ করতে হবে echo ""প্রম্পট টেক্সট সামনে নতুন লাইন যোগ করার জন্য শেষে।
nexayq

1
এটি দুর্দান্তভাবে কাজ করে, তবে আমি চাই না যে বিভাজকটি একেবারে শেষ এন্ট্রিতে প্রদর্শিত হবে। উদাহরণস্বরূপ, আপনার প্রতি ", এটির মতো দেখায় one" two" three", তবে আমি এটির মতো দেখাতে চাই one" two" three। নোট করুন শেষ তিনটির কোনও প্রথম বন্ধনী নেই। কোন ধারনা?
ওঙ্ক

2
@ লিঙ্ক আপনি sed '$s/..$//'শেষ লাইনে শেষ 2 টি অক্ষর মুছতে ফলাফলগুলিতে পাইপ করতে পারেন ।
ক্রিস সিমুর

3
আপনি যদি কিছু না দিয়ে নিউলাইনগুলি প্রতিস্থাপন করতে চান তবে আপনাকে --deleteডিফল্ট হিসাবে দুটি যুক্তি প্রত্যাশা করে বিকল্পটি ব্যবহার করতে হবে । যেমন tr --delete '\n'
এলিজা লিন

69

পাইপিং আউটপুট প্রতি আউটপুট xargsপ্রতিটি লাইন ফাঁকা সঙ্গে একক লাইনে সংযুক্ত করা হবে:

grep pattern file | xargs

বা কোনও আদেশ, যেমন। ls | xargsxargsআউটপুটটির ডিফল্ট সীমা ~ 4096 অক্ষর, তবে উদাহরণস্বরূপ বৃদ্ধি করা যেতে পারে। xargs -s 8192


| tr '\n' ' 'যখন php execফাংশন মাধ্যমে বলা হয় আমার জন্য কাজ করে না । এটি টিআর উপেক্ষা করছিল এবং গ্রেপ থেকে কেবল শেষ ম্যাচ দিচ্ছিল। | xargsকাজ করছে.
আদর্শ

3
এই সমাধানটিরও সুবিধা রয়েছে যে এটি ইনপুট থেকে ফাঁকা স্থান 'খায়'। +1
রিনি

55

ব্যাশে echoউদ্ধৃতি চিহ্ন বিনা ঘোড়ার গাড়ি আয়, ট্যাব এবং একাধিক স্পেস অপসারণ

echo $(cat file)

8
এখানে গুরুতরভাবে আন্ডাররেটেড উত্তর, এটি সত্যিই সহজ এবং একটি কবজির মতো কাজ করে, পাশাপাশি একটি পিছনের নিউলাইনও।
ড্যাঞ্জারক্রো

এটি বিশেষত ঝরঝরে যদি আপনি ব্যবহার করেনIFS="$(printf '\n\t')"
অ্যাগসোল

5
অথবা কেবল echo $(<file)... প্রতিধ্বনি ব্যবহার করা কেবল ব্যবহারের চেয়ে আরও পরিষ্কার নয় tr '\n' ' ', তবে আরও ভাল ( লিংক এন্ডিংগুলি ভাবেন \r\n) @ অ্যাগসোল আপনি কেবলই বলতে পারেনIFS=$'\n\t'
নরমালাইজ করুন

জায়গা ছাড়া কেমন?
দিমিডাক

22

এটি আপনি যা চান তা হতে পারে

cat file | grep pattern | paste -sd' '

আপনার সম্পাদনা হিসাবে, আমি নিশ্চিত না যে এর অর্থ কী, সম্ভবত এটি?

cat file | grep pattern | paste -sd'~' | sed -e 's/~/" "/g'

(এটি অনুমান করে যে ~এটি ঘটে না file)


2
@ স্টেফানকে ধরে নেওয়ার দরকার নেই যে cat fileএটি আসলে হবে cat, এমনকি একটি ফাইলও। (আমি শুধু যে অংশ অপরিবর্তিত যেমন প্রশ্নের অপ্রাসঙ্গিক ছিল বাম)
sehe

5

এটি একটি উদাহরণ যা কমা দ্বারা পৃথক আউটপুট উত্পাদন করে। আপনার যে বিভাজক প্রয়োজন তার দ্বারা কমা প্রতিস্থাপন করতে পারেন।

cat <<EOD | xargs | sed 's/ /,/g'
> 1
> 2
> 3
> 4
> 5
> EOD

সৃষ্টি করে:

1,2,3,4,5

3

exসম্পাদক ( ভিমের অংশ ) ব্যবহার করার পদ্ধতিটি এখানে :

  • জে ওন সমস্ত লাইন এবং পি স্ট্যান্ডার্ড আউটপুট:

    $ ex +%j +%p -scq! file
  • জে ওন সমস্ত লাইনে স্থান (ফাইলটিতে):

    $ ex +%j -scwq file

    দ্রষ্টব্য: এটি স্বয়ংক্রিয়ভাবে ফাইলের অভ্যন্তরে সমস্ত লাইন একত্রিত করবে!


2

এই সমস্যাটি সমাধান করার জন্য আমি জানি সবচেয়ে দ্রুত এবং সহজ উপায়:

যখন আমরা নতুন লাইনের চরিত্রটি \n স্থানের সাথে প্রতিস্থাপন করতে চাই :

xargs < file

xargsপ্রতি লাইন অক্ষরের সংখ্যা এবং একত্রিত সমস্ত অক্ষরের সংখ্যার নিজস্ব সীমা রয়েছে তবে আমরা সেগুলি বাড়াতে পারি। এই আদেশটি চালিয়ে বিশদগুলি পাওয়া যাবে: xargs --show-limitsএবং অবশ্যই ম্যানুয়ালটিতে:man xargs

যখন আমরা একটি চরিত্রকে অন্য একটি চরিত্রের সাথে প্রতিস্থাপন করতে চাই :

tr '\n' ' ' < file

যখন আমরা একটি চরিত্রকে অনেকগুলি অক্ষরের সাথে প্রতিস্থাপন করতে চাই :

tr '\n' '~' < file | sed s/~/many_characters/g

প্রথমে, আমরা টিল্ডসের \nজন্য নিউলাইন অক্ষরগুলি প্রতিস্থাপন করি ~(বা পাঠ্যের মধ্যে উপস্থিত না হয়ে অন্য একটি অনন্য অক্ষর চয়ন করি) এবং তারপরে আমরা টিল্ড অক্ষরগুলিকে অন্য কোনও অক্ষর ( many_characters) দিয়ে প্রতিস্থাপন করি এবং আমরা প্রতিটি টিল্ড (পতাকা g) এর জন্য এটি করি ।


0

সম্ভবত এটি করার সর্বোত্তম উপায় হ'ল 'awk' সরঞ্জামটি যা এক লাইনে আউটপুট উত্পন্ন করবে

$ awk ' /pattern/ {print}' ORS=' ' /path/to/file

এটি স্পেস ডিলিমিটারের সাথে সমস্ত লাইন এক সাথে একীভূত করবে


{print}এটি অ্যাজকের ডিফল্ট ক্রিয়া থেকে আপনার প্রয়োজন হবে না ।
পুরোপুরি

0

এখানে আরও একটি সহজ পদ্ধতি ব্যবহার করে awk:

# cat > file.txt
a
b
c

# cat file.txt | awk '{ printf("%s ", $0) }'
a b c

এছাড়াও, যদি আপনার ফাইলটিতে কলাম রয়েছে, তবে এটি কেবলমাত্র কয়েকটি নির্দিষ্ট কলামকে সংলগ্ন করার একটি সহজ উপায় দেয়:

# cat > cols.txt
a b c
d e f

# cat cols.txt | awk '{ printf("%s ", $2) }'
b e

-1

লাল টুপি লিনাক্সে আমি কেবল প্রতিধ্বনি ব্যবহার করি:

প্রতিধ্বনি $ (বিড়াল / কিছু / ফাইল / নাম)

এটি আমাকে কেবল একটি লাইনে একটি ফাইলের সমস্ত রেকর্ড দেয়।


2
এটি ইতিমধ্যে 2015 সালে উত্তর হয়েছে You আপনি কেবল এই উত্তরটির সদৃশ করছেন । আপনার নিজের পোস্ট করার আগে দয়া করে উত্তরগুলি পড়ুন, বিশেষত যখন প্রশ্নটি 7 বছরের পুরানো এবং ইতিমধ্যে 8 টি উত্তর রয়েছে।
মিকেল বি।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.