উদ্ধৃত এন্ট্রি সহ কমা দ্বারা পৃথক তালিকায় পৃথক রেখাগুলি রূপান্তর করা


15

আমার কাছে নিম্নলিখিত ডেটা রয়েছে (একটি রমার্কডাউন ফাইল থেকে পার্স করা আর প্যাকেজগুলির একটি তালিকা), যা আমি ইনস্টল করতে আর-এ যেতে পারি সেই তালিকায় পরিণত করতে চাই:

d3heatmap
data.table
ggplot2
htmltools
htmlwidgets
metricsgraphics
networkD3
plotly
reshape2
scales
stringr

আমি তালিকাটি ফর্মের তালিকায় পরিণত করতে চাই:

'd3heatmap', 'data.table', 'ggplot2', 'htmltools', 'htmlwidgets', 'metricsgraphics', 'networkD3', 'plotly', 'reshape2', 'scales', 'stringr'

আমার কাছে বর্তমানে বাশ পাইপলাইন রয়েছে যা কাঁচা ফাইল থেকে উপরের তালিকায় যায়:

grep 'library(' Presentation.Rmd \
| grep -v '#' \
| cut -f2 -d\( \
| tr -d ')'  \
| sort | uniq

আমি নতুন লাইনগুলি কমা দ্বারা পৃথক করা তালিকায় পরিবর্তন করতে একটি পদক্ষেপ যুক্ত করতে চাই। আমি যোগ করার চেষ্টা করেছি tr '\n' '","', যা ব্যর্থ হয়। আমি নীচের কয়েকটি স্ট্যাক ওভারফ্লো উত্তরও চেষ্টা করেছি, যা ব্যর্থ হয়:

এটি library(stringr)))phics)ফলাফল হিসাবে উত্পাদন করে ।

এটি ,%ফলাফল হিসাবে উত্পাদন করে ।

এই উত্তর ( -iপতাকা মুছে ফেলা সহ), ইনপুট অনুরূপ আউটপুট উত্পাদন করে।


ডিলিমিটারদের কমা-স্থান হওয়া দরকার, নাকি একা কমা গ্রহণযোগ্য?
স্টিল্ড্রাইভার

হয় ঠিক আছে, তবে আমার কাছে স্ট্রিংটির চারপাশে একটি উদ্ধৃতি চরিত্রের দরকার আছে, হয় 'বা হয় "
fbt


আমি কি প্রথম খেয়াল করেছি যে ইনপুট ডেটা এবং এটি প্রক্রিয়াকরণের স্ক্রিপ্টটি সম্পূর্ণ বেমানান। কোন আউটপুট হবে না।
ctrl-alt-delor

আমি তালিকাভুক্ত স্ক্রিপ্টটি হ'ল আমি কীভাবে ইনপুট ডেটা তৈরি করি। কেউ এটি চেয়েছিলেন। প্রকৃত ইনপুট ডেটা ভালো কিছু দেখাবে এই । নোট করুন গিথুব নতুন লাইনগুলি সরিয়ে ফর্ম্যাট পরিবর্তন করে।
fbt

উত্তর:


19

আপনি সেডের সাথে উদ্ধৃতি যোগ করতে পারেন এবং তারপরে পেস্টের সাথে লাইনগুলি মার্জ করতে পারেন:

sed 's/^\|$/"/g'|paste -sd, -

আপনি যদি কোনও জিএনইউ কোর্টিলস ভিত্তিক সিস্টেম (অর্থাত লিনাক্স) চালাচ্ছেন তবে আপনি অনুপস্থিতিকে বাদ দিতে পারেন '-'

যদি আপনার ইনপুট ডেটাটিতে ডস-স্টাইলের লাইন শেষ থাকে (যেমন @ পিএফকে প্রস্তাবিত), আপনি নিম্নলিখিতভাবে কমান্ডটি পরিবর্তন করতে পারেন:

sed 's/\r//;s/^\|$/"/g'|paste -sd, -

1
ম্যাকওএসে (এবং অন্যরাও হতে পারে), আপনাকে কোনও ড্যাশ অন্তর্ভুক্ত করতে হবে যাতে ইনপুটটি ফাইলের পরিবর্তে sed 's/^\|$/"/g'|paste -sd, -
স্টিডিনের থেকে আসে তা বোঝাতে

সত্য, পেস্টের "কোর্টিলস" সংস্করণ উভয় ফর্ম গ্রহণ করবে, তবে "-" আরও পসিক্স। ধন্যবাদ !
জেপেলিন

2
বা কেবল sedএকা সহ:sed 's/.*/"&"/;:l;N;s/\n\(.*\)$/, "\1"/;tl'
ডিজিটাল ট্রমা

1
@fbt আমার উত্তরের শেষে আমি যে নোটটি যুক্ত করেছি তা এখানেও প্রযোজ্য।
পিএইচকে

1
@ ডিজিটালট্রামা - আসলেই ভাল ধারণা নয়; এটি খুব ধীর হবে (এমনকি বিশাল ফাইলগুলির সাথে হ্যাংও হতে পারে) - এখানে কিউতে আমার মন্তব্যে লিঙ্কযুক্ত কিউয়ের উত্তরগুলি দেখুন; দুর্দান্ত জিনিসটি pasteএকা ব্যবহার করা;)
ডোন_ক্রিসটি

8
ব্যবহার awk:
awk 'BEGIN { ORS="" } { print p"'"'"'"$0"'"'"'"; p=", " } END { print "\n" }' /path/to/list
কম শেল পলায়নের বিকল্প এবং তাই আরও পঠনযোগ্য:
awk 'BEGIN { ORS="" } { print p"\047"$0"\047"; p=", " } END { print "\n" }' /path/to/list
আউটপুট:
'd3heatmap', 'data.table', 'ggplot2', 'htmltools', 'htmlwidgets', 'metricsgraphics', 'networkD3', 'plotly', 'reshape2', 'scales', 'stringr'
ব্যাখ্যা:

awkস্ক্রিপ্ট নিজেই সব পলায়নপর ছাড়া হয় BEGIN { ORS="" } { print p"'"$0"'"; p=", " } END { print "\n" }। প্রথম এন্ট্রি মুদ্রণের পরে ভেরিয়েবল pসেট করা হয় (এর আগে এটি খালি স্ট্রিংয়ের মতো)। এই ভেরিয়েবলের সাথে pপ্রতিটি এন্ট্রি (বা awkইনস্পিক: রেকর্ড ) প্রিফিক্সড এবং অতিরিক্তভাবে চারপাশে একক উদ্ধৃতি দিয়ে মুদ্রিত হয়। awkআউটপুট রেকর্ড বিভাজক পরিবর্তনশীল ORSপ্রয়োজন নেই (যেহেতু উপসর্গ এটা আপনার জন্য কাজ করা হয়) যাতে এ খালি হতে সেট করা হয় BEGINING। ওহ এবং আমরা আমাদের ফাইলটিকে ENDএকটি নতুন লাইন দিয়ে থাকতে পারি (যেমন, এটি পরবর্তী পাঠ্য-প্রক্রিয়াজাতকরণ সরঞ্জামগুলির সাথে কাজ করে); এই অংশটির প্রয়োজন নেই ENDএবং এর পরে সমস্ত কিছু (একক উদ্ধৃতিতে) সরিয়ে ফেলা যায়।

বিঃদ্রঃ

আপনার যদি উইন্ডোজ / ডস-স্টাইল লাইনের শেষ ( \r\n) থাকে তবে আপনাকে \nপ্রথমে ইউনিক্স স্টাইলে ( ) এ রূপান্তর করতে হবে । এটি করার জন্য আপনি tr -d '\015'আপনার পাইপলাইনের শুরুতে রাখতে পারেন :

tr -d '\015' < /path/to/input.list | awk […] > /path/to/output

(ধরে নিচ্ছি \rআপনার ফাইলটিতে আপনার কোনও ব্যবহার নেই Very এখানে খুব নিরাপদ অনুমান))

বিকল্পভাবে, কেবল dos2unix /path/to/input.listস্থানটি জায়গায় রূপান্তর করতে একবার চালান ।


আমি যখন এই কমান্ডটি চালাই, আমি ', 'stringr23aphicsআউটপুট হিসাবে পাই ।
fbt

@fbt আমার সর্বশেষ নোট দেখুন।
পিএইচকে

2
print p"'"'"'"$0"'"'"'"; p=", "Olyহোলির উদ্ধৃতি, ব্যাটম্যান!
wchargin

আমি জানি, রাইট- :) আমি উল্লেখ করেছি যে অনেকগুলি p"'\''"$0"'\''";শাঁটে মুদ্রণটিও কাজ করেছিল (এটি পজিক নয় যদিও), অথবা বিকল্পভাবে bashসি এর উদ্ধৃতি স্ট্রিং ব্যবহার করে ( $'') এমনকি ঠিক print p"\'"$0"\'";(যদিও অন্যান্য ব্যাকস্ল্যাশগুলি দ্বিগুণ করার প্রয়োজন হতে পারে) তবে রয়েছে awkএর চরিত্রটি ব্যবহার করে ইতিমধ্যে অন্যান্য পদ্ধতি পালিয়ে গেছে।
phk

বাহ, আমি বিশ্বাস করতে পারি না যে আপনি এটি বুঝতে পেরেছিলেন। ধন্যবাদ.
fbt

6

হিসাবে @ don_crissti এর লিঙ্ক উত্তর শো, অবিশ্বাস্যভাবে দ্রুত উপর পেস্ট বিকল্প সীমানা - লিনাক্স কার্নেলের বংশীধ্বনিতুল্য আরও দক্ষ চেয়ে আমি ঈমান নিয়ে আসতে সমবেতভাবে যদি আমি না এইমাত্র এটা চেষ্টা করেছিলেন। উল্লেখযোগ্যভাবে, আপনি যদি কমা + স্থানের পরিবর্তে আপনার তালিকা আইটেমগুলি পৃথক করে একক কমাতে খুশি হতে পারেন তবে একটি পেস্ট পাইপলাইন

(paste -d\' /dev/null - /dev/null | paste -sd, -) <input

এমনকি একটি যুক্তিসঙ্গত flexপ্রোগ্রামের চেয়ে দ্রুত (!)

%option 8bit main fast
%%
.*  { printf("'%s'",yytext); }
\n/(.|\n) { printf(", "); }

তবে যদি কেবল শালীন পারফরম্যান্স গ্রহণযোগ্য হয় (এবং আপনি যদি স্ট্রেস পরীক্ষা চালাচ্ছেন না, তবে আপনি কোনও ধ্রুবক-কারণের পার্থক্যগুলি পরিমাপ করতে সক্ষম হবেন না, তারা সকলেই তাত্ক্ষণিক) এবং আপনি আপনার বিভাজক এবং যুক্তিসঙ্গত উভয়ের সাথে উভয়ই নমনীয়তা চান -liner Y-Ness,

sed "s/.*/'&'/;H;1h;"'$!d;x;s/\n/, /g'

আপনার টিকিট হ্যাঁ, এটি লাইন শোরগোলের মতো দেখায়, তবে H;1h;$!d;xআইডিয়োম হ'ল সমস্ত জিনিস স্লাপ করার সঠিক উপায়, একবার আপনি যখন বুঝতে পারবেন যে পুরো জিনিসটি পড়তে আসলে সহজ হয়ে যায়, তার s/.*/'&'/পরে একটি স্লার্প এবং একটি s/\n/, /g


সম্পাদনা করুন: অযৌক্তিকের সাথে সীমাবদ্ধ, অন্য সব কিছুকে ফাঁকা করে ফেলার জন্য ফ্লেক্স পাওয়া মোটামুটি সহজ, কেবল স্টিডিয়োকে বলুন আপনার বিল্টিন মাল্টিথ্রেড / সিগন্যাল্যান্ডলার সিঙ্কের দরকার নেই:

%option 8bit main fast
%%
.+  { putchar_unlocked('\'');
      fwrite_unlocked(yytext,yyleng,1,stdout);
      putchar_unlocked('\''); }
\n/(.|\n) { fwrite_unlocked(", ",2,1,stdout); }

এবং স্ট্রেসের মধ্যে যা পেস্ট পাইপলাইনগুলির তুলনায় ২-৩ গুণ দ্রুত, যা নিজেরাই অন্য সব কিছুর চেয়ে কমপক্ষে 5x দ্রুত।


1
(paste -d\ \'\' /dev/null /dev/null - /dev/null | paste -sd, -) <infile | cut -c2-কমা + স্পেস @
কমপিডে

এই flexস্টাফটি বেশ জঘন্য শীতল মানুষ ... আমি এই প্রথম কাউকে flexএই সাইটে কোড পোস্ট করতে দেখি ... বড় বড়! এই স্টাফ আরও পোস্ট করুন।
don_crissti

@ ডন_ক্রিসটি ধন্যবাদ! আমি ভাল সুযোগগুলি সন্ধান করব, সেড / অ্যাডক / হোয়াট নোট সাধারণত সুবিধার সুবিধার জন্য সাধারণত আরও ভাল বিকল্প হয় তবে প্রায়শই খুব সহজ ফ্লেক্স উত্তরও পাওয়া যায়।
jthill

4

পার্ল

পাইথন ওয়ান-লাইনার:

$ python -c "import sys; print ','.join([repr(l.strip()) for l in sys.stdin])" < input.txt                               
'd3heatmap','data.table','ggplot2','htmltools','htmlwidgets','metricsgraphics','networkD3','plotly','reshape2','scales','stringr'

সরল উপায়ে কাজ করে - আমরা ইনপুট.টিএসটিএস্টকে শেল <অপারেটরটি ব্যবহার করে স্টিডিনে পুনর্নির্দেশ করি , প্রতিটি রেখাকে নিউলাইনগুলি .strip()সরিয়ে এবং repr()প্রতিটি লাইনের উদ্ধৃত উপস্থাপনা তৈরি করে একটি তালিকায় পড়ি । এরপরে তালিকাটি বিভাজক হিসাবে .join()ফাংশনের মাধ্যমে একটি বড় স্ট্রিংয়ে যুক্ত হয় is,

বিকল্পভাবে আমরা +প্রতিটি স্ট্রিপড লাইনের উদ্ধৃতিগুলি সংযুক্ত করতে ব্যবহার করতে পারি ।

 python -c "import sys;sq='\'';print ','.join([sq+l.strip()+sq for l in sys.stdin])" < input.txt

পার্ল

মূলত পূর্বের মত একই ধারণা: সমস্ত লাইন পড়ুন, নতুন লাইনের স্ট্র্যাপটি পড়ুন, একক উদ্ধৃতিতে ঘেরুন, অ্যারে @cvs এ সমস্ত কিছু স্টাফ করুন এবং কমা দিয়ে যোগ হওয়া অ্যারে মানগুলি মুদ্রণ করুন।

$ perl -ne 'chomp; $sq = "\047" ; push @cvs,"$sq$_$sq";END{ print join(",",@cvs)   }'  input.txt                        

'D3heatmap', 'data.table', 'ggplot2', 'htmltools', 'htmlwidgets', 'metricsgraphics', 'networkD3', 'plotly', 'reshape2', 'দাঁড়িপাল্লা', 'stringr'


আইআইআরসি, join
অজগরগুলির

@iruvar হ্যাঁ, ওপি'র পছন্দসই আউটপুটটি দেখুন - তারা প্রতিটি শব্দের উদ্ধৃতি চায় এবং আউটপুট একটি লাইন হয় তা নিশ্চিত করার জন্য আমাদের চলন্ত নিউলাইনগুলি সরিয়ে ফেলতে হবে। তালিকার বোধগম্যতা না করে কীভাবে তা করবেন আপনার একটি ধারণা আছে?
সের্গেই কোলোডিয়াজনি

3

আমি মনে করি নিম্নলিখিত ফাইলগুলি ঠিকঠাক করা উচিত, ধরে নেওয়া আপনার ফাইলের পাঠ্যে রয়েছে

d3heatmap
data.table
ggplot2
htmltools
htmlwidgets
metricsgraphics
networkD3
plotly
reshape2
scales
stringr

আসুন এমন অ্যারেগুলি ব্যবহার করুন যার পরিবর্তে শীতল বিকল্প রয়েছে:

#!/bin/bash
input=( $(cat text) ) 
output=( $(
for i in ${input[@]}
        do
        echo -ne "'$i',"
done
) )
output=${output:0:-1}
echo ${output//,/, }

স্ক্রিপ্টের আউটপুট নিম্নরূপ হওয়া উচিত:

'd3heatmap', 'data.table', 'ggplot2', 'htmltools', 'htmlwidgets', 'metricsgraphics', 'networkD3', 'plotly', 'reshape2', 'scales', 'stringr'

আমি বিশ্বাস করি এটিই আপনি খুঁজছিলেন?


1
সুন্দর সমাধান। তবে যখন ওপি স্পষ্টভাবে জিজ্ঞাসা করেনি bashএবং এটি নিরাপদ বলে ধরে নেওয়া হয় যে কেউ এটি ব্যবহার করতে পারে (সর্বোপরি এটিএইএইচএইচ এটি সর্বাধিক ব্যবহৃত শেল) তখনও এটি মঞ্জুর করা উচিত নয়। এছাড়াও, এমন কিছু অংশ রয়েছে যা আপনি উদ্ধৃত করার ক্ষেত্রে আরও ভাল কাজ করতে পারেন (ডাবল কোট রেখে)। উদাহরণস্বরূপ, প্যাকেজের নামগুলির মধ্যে শূন্যস্থানগুলির সম্ভাবনা কম থাকলেও পরিবর্তনের পরিবর্তে ভেরিয়েবলগুলি উদ্ধৃত করা ভাল কনভেনশন, আপনি এটির উপরে শেলচেক.net চালাতে এবং সেখানে নোট এবং ব্যাখ্যা দেখতে চাইতে পারেন ।
পিএইচকে

2

আমার প্রায়শই খুব অনুরূপ দৃশ্য থাকে: আমি এক্সেল থেকে একটি কলাম অনুলিপি করে কন্টেন্টকে কমা দ্বারা পৃথক করা তালিকায় রূপান্তর করতে চাই (যেমন এসকিউএল কোয়েরির মতো পরবর্তী ব্যবহারের জন্য ... WHERE col_name IN <comma-separated-list-here>)।

আমার .Bashrc এ এটিই রয়েছে:

function lbl {
    TMPFILE=$(mktemp)
    cat $1 > $TMPFILE
    dos2unix $TMPFILE
    (echo "("; cat $TMPFILE; echo ")") | tr '\n' ',' | sed -e 's/(,/(/' -e 's/,)/)/' -e 's/),/)/'
    rm $TMPFILE
}

আমি তখন সেন্টিমিড lblলাইনে ("লাইন বাই লাইন") চালিত যা ইনপুটটির জন্য অপেক্ষা করে, ক্লিপবোর্ড থেকে সামগ্রীটি আটকান, টিপুন <C-D>এবং ফাংশনটি ঘিরে থাকা ইনপুটটি ফিরিয়ে দেয় ()। এটি দেখতে এরকম দেখাচ্ছে:

$ lbl
1
2
3
dos2unix: converting file /tmp/tmp.OGM6UahLTE to Unix format ...
(1,2,3)

(আমি মনে করি না কেন আমি এখানে ডস 2 ইউনিক্স রেখেছি কারণ সম্ভবত এটি আমার সংস্থার সেটআপে সমস্যা সৃষ্টি করে))


1

সেডের কিছু সংস্করণ কিছুটা আলাদা কাজ করে তবে আমার ম্যাকের জন্য আমি "ইউনিট" ব্যতীত সব কিছু পরিচালনা করতে পারি:

sed -n -e '
# Skip commented library lines
/#/b
# Handle library lines
/library(/{
    # Replace line with just quoted filename and comma
    # Extra quoting is due to command-line use of a quote
    s/library(\([^)]*\))/'\''\1'\'', /
    # Exchange with hold, append new entry, remove the new-line
    x; G; s/\n//
    ${
        # If last line, remove trailing comma, print, quit
        s/, $//; p; b
    }
    # Save into hold
    x
}
${
    # Last line not library
    # Exchange with hold, remove trailing comma, print
    x; s/, $//; p
}
'

দুর্ভাগ্যক্রমে অনন্য অংশটি ঠিক করতে আপনাকে কিছু করতে হবে:

grep library Presentation.md | sort -u | sed -n -e '...'

--Paul


2
ইউনিক্স.স্ট্যাকেক্সচেঞ্জে স্বাগতম! আমি আপনাকে ভ্রমণ করতে পরামর্শ দিচ্ছি ।
স্টিফেন রাউচ

0

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

আপনি কেবল প্লেইন টেক্সট ফাইলটি (বলেছিলেন packages.txt) কোনও একক ভেরিয়েবলের ডেটাফ্রেম হিসাবে লোড করতে পারেন, যা আপনি ভেক্টর হিসাবে প্রত্যক্ষ করতে পারবেন, সরাসরি ব্যবহারযোগ্য install.packages। সুতরাং, এটিকে একটি ব্যবহারযোগ্য আর অবজেক্টে রূপান্তর করুন এবং সেই তালিকাটি ইনস্টল করুন:

df <- read.delim("packages.txt", header=F, strip.white=T, stringsAsFactors=F)
install.packages(df$V1)

বা কোনও বাহ্যিক ফাইল ছাড়াই:

packages <-" 
d3heatmap
data.table
ggplot2
htmltools
htmlwidgets
metricsgraphics
networkD3
plotly
reshape2
scales
stringr
"
df <- read.delim(textConnection(packages), 
header=F, strip.white=T, stringsAsFactors=F)
install.packages(df$V1)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.