আমি কীভাবে একটি একক লাইনে নিদর্শনগুলি "মার্জ" করতে পারি?


10

আমি গ্রেপ এবং সেড করছি এবং আমি আগ্রহী এমন একটি ফাইলের 2 টি লাইন পেয়েছি the নতুন লাইনের চরিত্রের সাথে শেষ হওয়া একটি লাইনে আমি এই লাইনগুলি কীভাবে পেতে পারি?
এখন আমি পাচ্ছি:

pattern1  
pattern2  

আমি পেতে চাই pattern1 pattern2 \n


1
আপনি কি নমুনা ডেটা আরও ভাগ করতে পারেন?
SLM

ব্যবহার printf %s\\n pattern1 pattern2 | sed '$!N;s/\n/ /'
ভ্যালেন্টাইন বাজরামি

আটকানো হ'ল কাজের একটি সরঞ্জাম, যদি আপনি একাধিক লাইন আউটপুট একত্রীকরণ করতে চান।
SLM

কোন নির্দিষ্ট সরঞ্জাম? আপনি কীভাবে এটি করার পরিকল্পনা করছেন?
ব্রায়াম

উত্তর:


7

paste:

{...pipeline...} | paste -d " " - -

এতে বলা হয়েছে: "স্ট্ডিনের (প্রথমটি -) একটি লাইন পড়ুন, স্টিডিনের দ্বিতীয় লাইনটি পড়ুন (দ্বিতীয় -), তারপরে একটি স্পেসের সাথে তাদের সাথে যোগ দিন"


বাশ-নির্দিষ্ট কৌশল:

$ x=$(grep -o pattern. test.txt)
$ echo "$x"
pattern1
pattern2
$ mapfile -t <<< "$x"
$ echo "${MAPFILE[*]}"
pattern1 pattern2

রেফ: http://www.gnu.org/software/bash/manual/bashref.html#index-mapfile


কী - -? হুকুম কি এমন?
জিম

@ জিম - হ্যাঁ এটি সঠিক। pasteআপনি কীভাবে ইনপুটটি প্রক্রিয়াজাত করতে চান তা সেগুলি বলছে । একসাথে 2 সময়ে 3 করতে আরও যুক্ত করুন। seq 10 | paste -d " " - -
SLM

6

আমি একাধারে তিনটি সংস্করণ বিভিন্ন পদ্ধতি রাখব

awk

printf %s\\n pattern1 pattern2 | awk -vRS="\n" -vORS=" " '1; END {print RS}'

SED

printf %s\\n pattern1 pattern2 | sed '$!N;s/\n/ /'

টিআর

printf %s\\n pattern1 pattern2 | tr '\n' ' '; echo

এবং আরও অনেক আছে।


trসমাধান বিভক্তি সম্পর্কে newline গেলা হবে, তাই আপনি যোগ করতে চাইতে পারেন ; echoযে এক
গ্লেন জ্যাকম্যান

@ ঠিক আছে! ইঙ্গিতটির জন্য ধন্যবাদ। আপনি যদিও উত্তরটি পরিবর্তন করতে পারেন নিরুক্ত। আমি কিছুটা মিস করেছি!
ভ্যালেন্টাইন বাজরামি

2

আপনি এটি শেল স্ক্রিপ্ট বা কমান্ড-লাইনে ব্যবহার করে করতে পারেন, কমান্ডের আউটপুটটিকে একটি ভেরিয়েবলের মধ্যে রেখে echoদিন:

# x=$(grep -e "pattern1\|pattern2" test)
# printf '%s\n' "$x"
pattern1 pattern2

অযোগ্য, ভেরিয়েবলটি ফাইলের নাম প্রসারণ সাপেক্ষে, সুতরাং ফলস্বরূপ আপনার যদি কোনও গ্লোব অক্ষর (যেমন *বা ?) থাকে তবে মানগুলি পরিবর্তন হতে পারে।
গ্লেন জ্যাকম্যান

@glennjackman, এটি উল্লেখ করার জন্য ধন্যবাদ, আমরা কীভাবে এটি ঠিক করতে পারি?
নিদাল

@ নেট ওয়ার্কার ব্যাকটিক্স ব্যবহার না করে $()পরিবর্তে .. এবং প্রিন্টফ ব্যবহার করেprintf '%s\n' "$x"
ভ্যালেন্টাইন বাজরামি

আমি আশা করব যে printf '%s\n' "$x"এটি "অভ্যন্তরীণ" নিউলাইনটি সরিয়ে ফেলবে না।
গ্লেন জ্যাকম্যান

2

সহ sed, আপনি এটি করতে পারেন:

<your previous commands> | sed '{N; s/\n/ /}'
  • N;sedপরের লাইনটি প্যাটার্ন স্পেসে যুক্ত করতে বলে , তাই এখন sedউভয় লাইনের সাথে কাজ করা হচ্ছে।
  • s/\n/ / দুটি লাইনের একত্রিত করে "একত্রিত" করে একটি স্থানের সাথে নতুন লাইনের চরিত্রটি প্রতিস্থাপন করে।

2

একটি সহজ উপায়, পাইপ আউটপুট xargs:

$ echo -e 'a\nb' | xargs
a b

এটি কেবলমাত্র ছোট আউটপুট নিয়ে কাজ করে, কারণ এটি কমান্ড লাইনে সর্বাধিক অক্ষর দ্বারা সীমাবদ্ধ। বৃহত্তম মান সিস্টেমের উপর নির্ভর করে আপনি এই মানটি ব্যবহার করে পেতে পারেন getconf ARG_MAX


1
( set -f; IFS='
'; printf '%s %s\n' $(grepcmd <input)
) >output

আইএফএস চাইলে এটি খেতে খুশি হবে।


-1

আপনার সেড / গ্রেপ ব্যাকটিক্সে আবদ্ধ করুন

যখন আপনার মূল আদেশ ছিল:

grep -i 'foo' mylog.log | sed 's/bar/baz/gi'

আপনার নতুন আদেশ হবে:

`grep -i 'foo' mylog.log | sed 's/bar/baz/gi'`

রেখার মাঝে ফাঁকা স্থান পায় না তবে আপনি সর্বদা অন্য সেড পাইপটি ব্যবহার করতে পারেন:

 | sed 's/$/ /'

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