দুটি ইকো কমান্ডের আউটপুটগুলির মধ্যে কীভাবে remove n সরান?


13

আমার কাছে প্রতিটি লাইনে একটি ফাইলের নামযুক্ত একটি পাঠ্য ফাইল রয়েছে:

111_c4l5r120.png
123_c4l4r60.png
135_c4l4r180.png
147_c4l3r60.png
15_c4l1r120.png
...

আমি এটিকে এই আকারে রূপান্তর করতে চাই:

111_c4l5r120.png 111
123_c4l4r60.png 123
135_c4l4r180.png 135
147_c4l3r60.png 147
15_c4l1r120.png 15
...

এই কোড ব্যবহার:

#!/bin/bash
while IFS='' read -r line || [[  -n "$line"  ]]; do
   echo "$line" >> output.txt   
   echo "$line" | cut -d'_' -f 1 >> output.txt
done < "$1"

তবে, ফলাফলটি হল:

111_c4l5r120.png 
111
123_c4l4r60.png 
123
135_c4l4r180.png 
135
147_c4l3r60.png 
147
15_c4l1r120.png 
15
...

ইচ্ছা আউটপুট পেতে আমার স্ক্রিপ্টটি কীভাবে পরিবর্তন করব?


গুগল আরও ভাল ফলাফল আবিষ্কার করে, যেমন এটি
থমাস ডিকি

উত্তর:


17

এর জন্য যদি আপনার শেলটি ব্যবহারের নির্দিষ্ট প্রয়োজন না থাকে তবে টেরডনের উত্তরটি আরও ভাল বিকল্প সরবরাহ করে।

যেহেতু আপনি ব্যবহার করছেন bash(স্ক্রিপ্টের শেবাংয়ে নির্দেশিত) তাই -nআপনি প্রতিধ্বনির বিকল্পটি ব্যবহার করতে পারেন :

echo -n "${line} " >> output.txt
echo "$line" | cut -d'_' -f 1 >> output.txt

অথবা আপনি লাইনটি ব্যবহার না করে প্রক্রিয়াজাত করতে শেল বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন cut:

echo "${line} ${line%%_*}" >> output.txt

(উভয় echoলাইন প্রতিস্থাপন )।

বিকল্পভাবে, printfকৌশলটিও করত, যে কোনও পসিক্স শেল-এ কাজ করে এবং সাধারণত ভাল হয় (দেখুন প্রিন্টফ প্রতিধ্বনির চেয়ে কেন ভালো? বিশদের জন্য):

printf "%s " "${line}" >> output.txt
echo "$line" | cut -d'_' -f 1 >> output.txt

অথবা

printf "%s %s\n" "${line}" "${line%%_*}" >> output.txt

(স্ট্রিক্টলি ভাষী, সমভূমি /bin/sh, echo -nপোর্টেবল নয় । আপনি স্পষ্টভাবে ব্যবহার করছেন যেহেতু bashএখানে এটা ঠিক আছে।)


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
টেরডন

23

শেল এ ধরণের জিনিস না! এটি প্রয়োজনীয়তার চেয়ে অনেক জটিল, ত্রুটির প্রবণ এবং অনেক দূরে, ধীর। এই জাতীয় পাঠ্য ম্যানিপুলেশন জন্য অনেক সরঞ্জাম ডিজাইন করা আছে। উদাহরণস্বরূপ, sedএখানে (এর জন্য সাম্প্রতিক জিএনইউ বা বিএসডি বাস্তবায়ন অনুমান করে -E):

$ sed -E 's/([^_]*).*/& \1/' file
111_c4l5r120.png 111
123_c4l4r60.png 123
135_c4l4r180.png 135
147_c4l3r60.png 147
15_c4l1r120.png 15

বা, যে কোনও জন্য sed:

$ sed 's/\([^_]*\).*/& \1/' file
111_c4l5r120.png 111
123_c4l4r60.png 123
135_c4l4r180.png 135
147_c4l3r60.png 147
15_c4l1r120.png 15

পার্ল:

$ perl -pe 's/(.+?)_.*/$& $1/' file
111_c4l5r120.png 111
123_c4l4r60.png 123
135_c4l4r180.png 135
147_c4l3r60.png 147
15_c4l1r120.png 15

awk:

$ awk -F_ '{print $0,$1}' file
111_c4l5r120.png 111
123_c4l4r60.png 123
135_c4l4r180.png 135
147_c4l3r60.png 147
15_c4l1r120.png 15

1
বাহ্যিক ইউটিলিটিগুলি যদিও খুব ভাল হয় না।
ইকনস

6
@। হ্যাঁ তারা। বাস্তবতার জন্য দ্রুততরতার কয়েকটি অর্ডার orders শেলটি এই ধরণের জিনিসটিতে খুব ভাল নয়। একটি শেলের প্রধান কাজ সর্বোপরি বাহ্যিক ইউটিলিটি চালু করা। এখানের যে কোনও সমাধানের দ্বারা নেওয়া ওপির দৃষ্টিভঙ্গির সাথে তুলনা করুন। শেল লুপগুলি খুব, খুব ধীর। আপনি আরো বিশ্বাসযোগ্য প্রয়োজন হয়, তাহলে পড়তে এই
টেরডন

বহনযোগ্যতার দিক থেকে, না। গতির বিচারে হ্যাঁ এছাড়াও, @ স্টাফেন চ্যাজেলাস কি আপনার উপনাম?
ইকনস

4
@ ΈρικΚωνσταντόπουλος Θα 'θελα :) না, তিনি কেবল দুটি দুর্দান্ত উত্তর লিখেছেন যা দুটি মন্তব্য থ্রেডের সাথে প্রাসঙ্গিক ছিল। বহনযোগ্যতার ক্ষেত্রে, পার্ল পদ্ধতির (অপ্রাপ্তবয়স্ক) ব্যতিক্রম ব্যতীত যা কেবলমাত্র n 90% * নিক্স মেশিনের মতো কিছুতে কাজ করবে, তিনটি সমাধানই পোর্টেবল এবং শেল অজোনস্টিক। অথবা, ঠিক আছে, আপনি সবসময় বানাতে পারে sedএক মধ্যে sed 's/\([^_]*\).*/& \1/' fileঅতিরিক্ত বহনযোগ্যতা জন্য। পয়েন্টটি হ'ল, আপনি অন্য যে কোনও কিছুর উপর নির্ভর করতে পারবেন তার চেয়ে বেশি পরিমাণে আপনি সেখানে গুনতে awkএবং sedথাকতে পারেন।
টেরডন

2

আপনি এখানে:

#!/bin/bash

while IFS='' read -r line || [[  -n "$line"  ]]; do
   echo "$line" `echo "$line" | cut -d'_' -f 1` >> output.txt
#   echo "$line" | cut -d'_' -f 1 >> output.txt
done < "$1"

আউটপুট:

$ rm -rf output.txt
$ ./test.sh 1.1; cat output.txt
111_c4l5r120.png 111
123_c4l4r60.png 123
135_c4l4r180.png 135
147_c4l3r60.png 147
15_c4l1r120.png 15
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.