একক কমা-বিচ্ছিন্ন একাধিক-লাইন স্ট্রিং রূপান্তর


99

ধরা যাক আমার কাছে নিম্নলিখিত স্ট্রিং রয়েছে:

something1:    +12.0   (some unnecessary trailing data (this must go))
something2:    +15.5   (some more unnecessary trailing data)
something4:    +9.0   (some other unnecessary data)
something1:    +13.5  (blah blah blah)

আমি কীভাবে এটি সরলভাবে করব

+12.0,+15.5,+9.0,+13.5

বাশে?


আসুন এক মুহুর্তের জন্য পিছনে ফিরে আসি এবং এই থ্রেডটিকে একটি প্রোগ্রামিং ভাষা হিসাবে বাশের এক সুস্পষ্ট ইন্ডিকেটমেন্ট বিবেচনা করি। স্কালার listOfStuff mkString ", ", বা হাস্কেলের বিবেচনা করুনintercalate ", " listOfString
এফপি ফ্রি

উত্তর:


94

আপনি ব্যবহার করতে পারেন awkএবং sed:

awk -vORS=, '{ print $2 }' file.txt | sed 's/,$/\n/'

বা আপনি যদি পাইপ ব্যবহার করতে চান তবে:

echo "data" | awk -vORS=, '{ print $2 }' | sed 's/,$/\n/'

এটি ভেঙে ফেলার জন্য:

  • awk ক্ষেত্রগুলিতে বিভক্ত ডেটা পরিচালনা করার ক্ষেত্রে দুর্দান্ত
  • -vORS=,"আউটপুট রেকর্ড বিভাজক" সেট করে ,, যা আপনি চেয়েছিলেন
  • { print $2 }awkপ্রতিটি রেকর্ডের জন্য দ্বিতীয় ক্ষেত্র (লাইন) মুদ্রণ করতে বলে
  • file.txt আপনার ফাইলের নাম
  • sedকেবল পেছন থেকে মুক্তি পান ,এবং এটিকে একটি নতুন লাইনে পরিণত করেন (আপনি যদি নতুন লাইন না চান তবে আপনি এটি করতে পারেন s/,$//)

4
awk: अवैध-ভি বিকল্প :(
মার্সেলাস ওয়ালেস

6
-V এবং ওআরএস = এর মধ্যে একটি স্থান যুক্ত করুন (আমার জন্য, অক্সে)
গ্রাহাম পি হিথ

পাইপ আলাদা হওয়ার জন্য একই কমান্ডটি কীভাবে করবেন? awk -v ORS=| '{ print $1 }' DCMC.rtf | sed 's/,$/\n/'ত্রুটি পাচ্ছি
যোগেশ

4
আশ্চর্যের সাথে, যখন আমি এটি করার চেষ্টা করি তখন আউটপুট খালি থাকে।
চিরন্তন

4
আমি মনে করি পাইপযুক্ত সংস্করণটির জন্য এটি হওয়া উচিত {print $1}অন্যথায় আমি আউটপুটে কেবল কমা পেয়ে যাচ্ছি
প্রেজেমেসো চেকোভস্কি

167

পরিষ্কার এবং সহজ:

awk '{print $2}' file.txt | paste -s -d, -

4
এটি এখানে সেরা উত্তর এবং স্পষ্টতই এটি করার সঠিক উপায়
forresthopkinsa

আমি একক / ডাবল উদ্ধৃতি দিয়ে প্রতিটি মানকে কীভাবে উদ্ধৃত করব?
হুসেন

4
@ cat thing | awk -F',' '{ print "'\''" $7 "'\' '" }' | paste -s -d ','
হুসেইন

,'সীমানা হিসাবে কিভাবে ব্যবহার ?
কাসুন সিয়ামম্বলাপিতিয়া

স্ট্রিংয়ে কোনও সিআরএলএফ থাকলে উইন্ডোজ নিউলাইনগুলি (যেমন ব্যবহার করা dos2unix) হ্যান্ডেল করতে ভুলবেন না Remember
বোই


10
$ awk -v ORS=, '{print $2}' data.txt | sed 's/,$//'
+12.0,+15.5,+9.0,+13.5

$ cat data.txt | tr -s ' ' | cut -d ' ' -f 2 | tr '\n' ',' | sed 's/,$//'
+12.0,+15.5,+9.0,+13.5

চিয়ার্স, কী কী হবে তা যদি স্ট্যান্ডার্ড ইনপুটের মাধ্যমে অবাক করা হয় (স্রেফ function | awk...আপনার উদাহরণে রাখবেন?
অ্যালেক্স কপলান


10

এটি আপনার পক্ষে কাজ করতে পারে:

cut -d' ' -f5 file | paste -d',' -s
+12.0,+15.5,+9.0,+13.5

বা

sed '/^.*\(+[^ ]*\).*/{s//\1/;H};${x;s/\n/,/g;s/.//p};d' file
+12.0,+15.5,+9.0,+13.5

বা

sed 's/\S\+\s\+//;s/\s.*//;H;$!d;x;s/.//;s/\n/,/g' file

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

এনবি লেখা যেতে পারে:

sed 's/\S\+\s\+//;s/\s.*//;1h;1!H;$!d;x;s/\n/,/g' file


4

আপনি ব্যবহার করতে পারেন grep:

grep -o "+\S\+" in.txt | tr '\n' ','

যা স্ট্রিংটি +কোনও স্ট্রিং দিয়ে শুরু করে এবং \S\+তারপরে নতুন রেখার অক্ষরগুলিকে কমাতে রূপান্তরিত করে। বড় ফাইলগুলির জন্য এটি বেশ দ্রুত হওয়া উচিত।



3

এটা চেষ্টা কর:

sedSelectNumbers='s".* \(+[0-9]*[.][0-9]*\) .*"\1,"'
sedClearLastComma='s"\(.*\),$"\1"'
cat file.txt |sed "$sedSelectNumbers" |tr -d "\n" |sed "$sedClearLastComma"

ভাল জিনিস হ'ল নতুন লাইন "characters n" অক্ষর মুছে ফেলার সহজ অংশ!

সম্পাদনা করুন: sed সঙ্গে একটি একক লাইন মধ্যে লাইন যোগদানের জন্য অন্য মহান এই হল: |sed ':a;N;$!ba;s/\n/ /g'থেকে পেয়েছেন এখানে


যে সম্পাদনাটি দুর্দান্ত - +1!
জোগ

2

খাঁটি বাশে লেখা একটি সমাধান:

#!/bin/bash

sometext="something1:    +12.0   (some unnecessary trailing data (this must go))
something2:    +15.5   (some more unnecessary trailing data)
something4:    +9.0   (some other unnecessary data)
something1:    +13.5  (blah blah blah)"

a=()
while read -r a1 a2 a3; do
    # we can add some code here to check valid values or modify them
    a+=("${a2}")
done <<< "${sometext}"
# between parenthesis to modify IFS for the current statement only
(IFS=',' ; printf '%s: %s\n' "Result" "${a[*]}")

ফলাফল: + 12.0, + 15.5, + 9.0, + 13.5



0

পার্ল সহ:

fg@erwin ~ $ perl -ne 'push @l, (split(/\s+/))[1]; END { print join(",", @l) . "\n" }' <<EOF
something1:    +12.0   (some unnecessary trailing data (this must go))
something2:    +15.5   (some more unnecessary trailing data)
something4:    +9.0   (some other unnecessary data)
something1:    +13.5  (blah blah blah)
EOF

+12.0,+15.5,+9.0,+13.5

0

আপনি দুটি সেড কল দিয়ে এটি করতে পারেন:

$ cat file.txt 
something1:    +12.0   (some unnecessary trailing data (this must go))
something2:    +15.5   (some more unnecessary trailing data)
something4:    +9.0   (some other unnecessary data)
something1:    +13.5  (blah blah blah)
$ sed 's/^[^:]*: *\([+0-9.]\+\) .*/\1/' file.txt | sed -e :a -e '$!N; s/\n/,/; ta'
+12.0,+15.5,+9.0,+13.5

প্রথম সেড কল উদ্বেগজনক ডেটা সরিয়ে দেয় এবং দ্বিতীয়টি সমস্ত লাইনে যোগ দেয়।


0

আপনি এই জাতীয় মুদ্রণ করতে পারেন:

শুধু awk: ব্যবহার printf,

bash-3.2$ cat sample.log
something1:    +12.0   (some unnecessary trailing data (this must go))
something2:    +15.5   (some more unnecessary trailing data)
something4:    +9.0   (some other unnecessary data)
something1:    +13.5  (blah blah blah)

bash-3.2$ awk ' { if($2 != "") { if(NR==1) { printf $2 } else { printf "," $2 } } }' sample.log
+12.0,+15.5,+9.0,+13.5

0

ড্যান ফেগো-র অ্যাজকের মতো আরও একটি পার্ল সমাধান:

perl -ane 'print "$F[1],"' file.txt | sed 's/,$/\n/'

-a পারলকে @F অ্যারেতে ইনপুট লাইনটি বিভক্ত করতে বলে যা 0 থেকে শুরু করে সূচিযুক্ত।


0

ভালতম অংশ সম্ভবত দ্বিতীয় "কলাম" নির্বাচন করছে যেহেতু একাধিক স্পেসকে এক হিসাবে বিবেচনা করার সহজ উপায় আমি জানতাম না। বাকি জন্য এটি সহজ। বাশ বিকল্প ব্যবহার করুন।

# cat bla.txt
something1:    +12.0   (some unnecessary trailing data (this must go))
something2:    +15.5   (some more unnecessary trailing data)
something4:    +9.0   (some other unnecessary data)
something1:    +13.5  (blah blah blah)

# cat bla.sh
OLDIFS=$IFS
IFS=$'\n'
for i in $(cat bla.txt); do
  i=$(echo "$i" | awk '{print $2}')
  u="${u:+$u, }$i"
done
IFS=$OLDIFS
echo "$u"

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