Xargs এর ফর্ম্যাট আউটপুট


10

আমি আউটপুট xargs প্রদর্শনগুলির বিন্যাসটি পরিবর্তন করতে চাই

cat k.txt 
1 
2 
3 

এবং

cat k.txt | xargs 
1 2 3

তবে আমি চাই 1, 2, 3বা চাই 1|2|3। কোন পরামর্শ?


এটি কিছু (যেমন ঠিক তেমন নয়) মতো অর্জন করা যেতে পারে xargs cat -nতবে আপনি যদি নতুন লাইনের চরিত্রগুলি কেবল ছাঁটাই করেন তবে এটি সহজ হয় echo $(cat), grepবা awk(এটি করার জন্য ক্রল করুন)। xargsআপনার বর্তমান উদ্দেশ্যে ভাল ফিট না।
41754

উত্তর:


18

নীচে এক ডজন বা তার উদাহরণ রয়েছে যাতে আপনি কীভাবে কোনও ফাইল নিতে পারেন:

$ cat k.txt
1
2
3

এবং এই ফর্ম্যাট এ রূপান্তর:

1,2,3

উপরের ফাইলটি তৈরি করতে আপনি এই আদেশটি ব্যবহার করতে পারেন যদি আপনি পাশাপাশি খেলতে চান:

$ cat <<EOF > k.txt
1
2
3
EOF

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

আমি বেশিরভাগ স্ক্রিপ্টিং ভাষাগুলির প্রতিনিধিত্ব করি with কিছুগুলি একাধিকবার উপস্থাপিত হয়, যেহেতু সাধারণত পার্ল, টিমটোড্ডিআই-তে উল্লেখ করা বিখ্যাত সংক্ষিপ্ত বিবরণ হিসাবে

দ্রষ্টব্য: আপনি ,নীচের উদাহরণগুলিতে কমা ( )) অদলবদল করতে পারেন এবং এটি আপনার পছন্দমতো অক্ষরের সাথে প্রতিস্থাপন করতে পারবেন, যেমন |

উদাহরণস্বরূপ যে "কাজ"

এই কোড স্নিপেটগুলি পছন্দসই আউটপুট উত্পাদন করবে।

pasteকমান্ড প্রয়োগ করুন:

$ paste -s -d ',' k.txt 
1,2,3

sedকমান্ড প্রয়োগ করুন:

$ sed ':a;N;$!ba;s/\n/,/g' k.txt
1,2,3

$ sed ':a;{N;s/\n/,/};ba' k.txt 
1,2,3

perlকমান্ড প্রয়োগ করুন:

$ perl -00 -p -e 's/\n(?!$)/,/g' k.txt
1,2,3

$ perl -00 -p -e 'chomp;tr/\n/,/' k.txt
1,2,3

awkকমান্ড প্রয়োগ করুন:

$ awk '{printf"%s%s",c,$0;c=","}' k.txt
1,2,3

$ awk '{printf "%s,",$0}' k.txt | awk '{sub(/\,$/,"");print}'
1,2,3

$ awk -vORS=, 1 k.txt | awk '{sub(/\,$/,"");print}'
1,2,3

$ awk 'BEGIN {RS="dn"}{gsub("\n",",");print $0}' k.txt | awk '{sub(/\,$/,"");print}'
1,2,3

pythonকমান্ড প্রয়োগ করুন:

$ python -c "import sys; print sys.stdin.read().replace('\n', ',')[0:-1]" <k.txt
1,2,3

$ python -c "import sys; print sys.stdin.read().replace('\n', ',').rstrip(',')" <k.txt
1,2,3

বাশের mapfileঅন্তর্নির্মিত:

$ mapfile -t a < k.txt; (IFS=','; echo "${a[*]}")
1,2,3

rubyকমান্ড প্রয়োগ করুন:

$ ruby -00 -pe 'gsub /\n/,",";chop' < k.txt
1,2,3

$ ruby -00 -pe '$_.chomp!"\n";$_.tr!"\n",","' k.txt
1,2,3

phpকমান্ড প্রয়োগ করুন:

$ php -r 'echo strtr(chop(file_get_contents($argv[1])),"\n",",");' k.txt
1,2,3

আদেশ সহকারে

উপরের উদাহরণগুলির বেশিরভাগই ঠিক কাজ করবে। কারও কারও কাছে লুকানো সমস্যা রয়েছে যেমন উপরের পিএইচপি উদাহরণ। ফাংশনটি chop()আসলে একটি উপনাম rtrim(), সুতরাং শেষ লাইনের পিছনের স্থানগুলিও সরানো হবে।

প্রথম রুবির উদাহরণ এবং প্রথম পাইথনের উদাহরণটিও করুন। সমস্যাটি কীভাবে তারা সকলেই একটি ধরণের অপারেশন ব্যবহার করছে যা মূলত "চপস" বন্ধ করে দেয়, অন্ধভাবে, একটি চলন্ত চরিত্র। ওপি যে উদাহরণটি দিয়েছে তার উদাহরণ হিসাবে এটি ঠিক আছে, তবে এই ধরণের এক লাইনার ব্যবহার করার সময় তারা অবশ্যই প্রক্রিয়াজাত করা ডেটার সাথে সামঞ্জস্য রয়েছে তা নিশ্চিত করতে হবে।

উদাহরণ

আমাদের নমুনা ফাইলটি বলুন, k.txtপরিবর্তে এর মতো দেখতে:

$ echo -en "1\n2\n3" > k.txt

এটি দেখতে অনুরূপ তবে এর মধ্যে কিছুটা পার্থক্য রয়েছে। \nমূল ফাইলের মতো এটির পিছনে নতুন লাইন নেই ( )। এখন যখন আমরা প্রথম পাইথনের উদাহরণ চালাই আমরা এটি পাই:

$ python -c "import sys; print sys.stdin.read().replace('\n', ',')[0:-1]" <k.txt
1,2,

উদাহরণস্বরূপ যে "প্রায়" কাজ করে

এগুলি হ'ল "সর্বদা এক বর, কখনও কনে না" উদাহরণ। তাদের বেশিরভাগই সম্ভবত অভিযোজিত হতে পারে, তবে কোনও সমস্যার সম্ভাব্য সমাধানের কাজ করার সময়, যখন এটি "জোরপূর্বক" বোধ করে, সম্ভবত এটি কাজের ভুল সরঞ্জাম!

perlকমান্ড প্রয়োগ করুন:

$ perl -p -e 's/\n/,/' k.txt
1,2,3,

trকমান্ড প্রয়োগ করুন:

$ tr '\n' ','  < k.txt 
1,2,3,

cat+ + echoকমান্ড:

$ echo $(cat k.txt)
1 2 3

rubyকমান্ড প্রয়োগ করুন:

$ ruby -pe '$_["\n"]=","' k.txt
1,2,3,

বাশের while+ readবিল্ট-ইনগুলি:

$ while read line; do echo -n "$line,"; done < k.txt
1,2,3,

1
সম্পর্কিত awkআমি একটি সংক্ষিপ্ত বিকল্প পছন্দ:awk -vORS=, 1 k.txt
manatwork

CentOS আছে কি না তা নিশ্চিত নয় bash:mapfile -t a < k.txt; (IFS=','; echo "${a[*]}")
2'13

পেছনের নিউলাইন সম্পর্কে নিশ্চিত নয়। আমার পরীক্ষা অনুযায়ী আপনার perlএবং প্রথম awkতাদেরও আছে has
manatwork

আমি ওকে উপরে রেখে দিতাম paste। ঠিক এটাই paste -sএখানে। এটি একটি স্ট্যান্ডার্ড কমান্ড এবং সবচেয়ে দক্ষ হবে। অন্য সমস্তগুলি ওভারকিল এবং / অথবা বহনযোগ্য নয় বা সীমাবদ্ধতা রয়েছে।
স্টাফেন চেজেলাস

mapfileতুলনামূলকভাবে নতুন, bash4.0 এ যুক্ত হয়েছে ।
manatwork

4

@ এসএলএম ইতিমধ্যে সুন্দর উত্তর দিয়েছে, তবে আপনার প্রশ্ন হিসাবে "xargs এর ফর্ম্যাট আউটপুট"

xargs -I{} echo -n "{}|" < test.txt
  • -I "প্রতিস্থাপন স্ট্রিং" বিকল্প হয়।
  • {} আউটপুট পাঠ্যের জন্য একটি স্থানধারক।
  • এটি "সন্ধান" -তে একটি কোঁকড়ানো-বন্ধনী জুটির ব্যবহারের অনুরূপ।

আপনি যদি পেছন থেকে মুক্তি পেতে চান তবে আপনি কিছু পরিষ্কার |করতে ব্যবহার করতে পারেন sed:

$ xargs -I{} echo -n "{}|" < k.txt  | sed -e 's/|$//'
1|2|3

এটি ৩. "1 | 2 | 3 |" পরে একটি অতিরিক্ত পাইপ পরীক্ষা করে। আমি কিছুক্ষণ লুপ এবং অ্যাজক সমাধান দিয়ে একই সমস্যাটি করছি।
slm

হ্যাঁ, যদি সেখানে নতুন লাইন .. হয় tr, sedএবং অন্যান্য এছাড়াও ..
রাহুল পাতিল

2

এটি একটি পুরানো থ্রেড, আমি জানি। ওপির মতো একটি সাধারণ কোড সহ জিজ্ঞাসা করা হয়েছিল। এটি আসলটির কাছাকাছি রাখতে আমার একটি সহজ সমাধান রয়েছে।

cat k.txt | xargs
1 2 3

সেড ব্যবহার করুন

cat k.txt | xargs | sed 's/ /,/g'
1,2,3

অথবা

cat k.txt | xargs | sed 's/ /|/g'
1|2|3

সেড দেখতে কিছুটা অদ্ভুত তবে ভেঙে পড়েছে, এটি অনেক বেশি অর্থবোধ করে।

এর বিকল্প জন্য। g 'বিশ্বব্যাপী জন্য: এটি ছাড়া এটি প্রতিটি নতুন লাইনে কেবলমাত্র প্রথম প্রতিস্থাপন করবে do যেহেতু আপনি 'xargs' ব্যবহার করেন এটি এগুলিকে এক লাইন হিসাবে প্রদর্শন করে। সুতরাং আপনি "1,2 3" পাবেন।

ডিলিমিটারটি পৃথককরণের জন্য ব্যবহৃত হয়। আমি / চরিত্রটি ব্যবহার করেছি। একটি আকর্ষণীয় কৌশল: যতক্ষণ না আমরা এটিকে উদ্ধৃতিগুলির মধ্যে একই ফর্ম্যাটটি রাখি ততক্ষণ আপনি অন্য যে কোনও চরিত্রের সাথে ডিলিমিটারটি প্রতিস্থাপন করতে পারেন। সুতরাং এটি কাজ করবে ....

cat k.txt | xargs | sed 's# #,#g'

অথবা

cat k.txt | xargs | sed 'sT T,Tg'

স্পষ্টতই, ডেলিমিটার হিসাবে নির্দিষ্ট অক্ষরগুলি ব্যবহার করা বিভ্রান্তি পেতে পারে, তাই স্মার্ট হন।


0
xargs <k.txt | tr \  \|

আপনার যা দরকার তা না cat- শুধু ফাইল ইনপুট মধ্যে পাস এবং - যদি অন্য কোন কমান্ড দেওয়া - xargsসঙ্গে একটি ধরনের যা - তার ডিফল্ট বিন্যাস আউট পাস হবে /bin/echo'র (ব্যাকস্ল্যাশ সি-পালাবার ব্যাখ্যা ছাড়া)

xargsইনপুট ফাইল থেকে মাথা / লেজ সাদা অংশ ছিনিয়ে নেবে এবং সাদা স্থানের অন্যান্য ক্রমগুলি একক স্থানের নিচে চেপে ধরবে। এর অর্থ এই যে থেকে ফাইল ক্ষণস্থায়ী যখন trথেকে xargsমত:

tr \\n \| <k.txt | xargs

... কপি করে প্রিন্ট ...

1|2|3|

... যাচ্ছে অন্য উপায় এবং এর শুধুমাত্র অপারেটিং args যে xargsস্থান-delimits করে ....

1|2|3\n

... কারণ xargsচূড়ান্ত ট্রেলিং করা নতুন লাইনটি প্রিন্ট করে (যেমন কোনও পাঠ্য ফাইলের জন্য প্রয়োজনীয়) তবে এটি trসেভাবে উত্তর দেয় না ।

দ্রষ্টব্য, যদিও, এই (বা এখানে প্রস্তাবিত অন্য কোনও সমাধান)xargs ইনপুট-এ উদ্ধৃতি দেওয়ার জন্য অ্যাকাউন্ট করে না । xargsইনপুটটিতে আক্ষরিকভাবে একক / ডাবল / ব্যাকস্ল্যাশ-উদ্ধৃত অ-নিউলাইন হোয়াইটস্পেস চরগুলি বের করে দেবে, যা তাদের নিজের মতো উদ্ধৃত করা যেতে পারে:

xargs <<\IN
1    2'      3'\'      \'4
IN

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