আমার কাছে কিছু পাঠ্য ফাইল রয়েছে যার মধ্যে কয়েকটি কলাম বিভিন্ন স্থানের দ্বারা পৃথক করা আছে তবে পরিবর্তে আমার বিভাজক হিসাবে একটি একক ট্যাব দরকার। বাশে করা কি সম্ভব?
আমার কাছে কিছু পাঠ্য ফাইল রয়েছে যার মধ্যে কয়েকটি কলাম বিভিন্ন স্থানের দ্বারা পৃথক করা আছে তবে পরিবর্তে আমার বিভাজক হিসাবে একটি একক ট্যাব দরকার। বাশে করা কি সম্ভব?
উত্তর:
একাধিক স্পেসের ক্রমকে একটি ট্যাবে রূপান্তর করতে , তবে পৃথক স্পেসটি একা রেখে দিন :
sed 's/ \+ /\t/g' inputfile > outputfile
বেশ কয়েকটি ফাইলের জন্য এটি করতে:
for inputfile in *
do
sed 's/ \+ /\t/g' "$inputfile" > tmpfile && mv tmpfile "$inputfile"
done
অথবা
for inputfile in *
do
sed -i.bak 's/ \+ /\t/g' "$inputfile"
done
অথবা
find . -type f -exec sed -i.bak 's/ \+ /\t/g' {} \;
sed: -e expression #1, char 1: unknown command: `.'
find
নীচে এক।
sed
ব্যাকআপের সম্প্রসারণের আগে জিএনইউ কোনও স্থান রাখতে পছন্দ করে না। আমি আমার উত্তর সম্পাদনা করেছি। প্রতিবেদনের জন্য ধন্যবাদ।
যদি আপনার চরিত্রটি একাধিক ট্যাব হয় তবে আপনি এটি ব্যবহার করতে পারেন tr -s
:
-s, --squeeze-repeats replace each input sequence of a repeated character
that is listed in SET1 with a single occurrence
উদাহরণ স্বরূপ:
my_file.txt | tr -s " "
সমস্ত সাদা স্থান এক হয়ে যাবে।
আপনি sed
একটি ট্যাব দিয়ে অনেকগুলি স্পেস প্রতিস্থাপন করতে ব্যবহার করতে পারেন :
এক বা একাধিক স্পেসকে একটি ট্যাবের সাথে প্রতিস্থাপনের উদাহরণ:
cat spaced-file | sed 's/ \+/\t/g' > tabbed-file
শুধুমাত্র ব্যবহার করে সবচেয়ে সহজ উত্তর bash
:
while read -r col1 col2 col3 ...; do
echo -e "$col1\t$col2\t$col3..."
done <file
যদি কলামের পরিবর্তনশীল সংখ্যা থাকে তবে আপনি এটি করতে পারেন তবে এটি কেবল কাজ করবে bash
, না sh
:
while read -r -a cols; do
(
IFS=$'\t'
echo "${cols[*]}"
)
done <file
যেমন
while read -r -a cols; do
(
IFS=$'\t'
echo "${cols[*]}"
)
done <<EOF
a b c
d e f
g h i
EOF
সৃষ্টি করে:
a b c
d e f
g h i
(প্রত্যেকের মধ্যে একটি ট্যাব রয়েছে তবে আমি এখানে এটি পেস্ট করলে এটি দেখতে পারা শক্ত)
আপনি এটি ব্যবহার করে sed
বা করতে পারেন tr
, তবে লক্ষ্য করুন যে শুরুর দিকে ফাঁকা হ্যান্ডলিং বিভিন্ন ফলাফল দেয় produces
sed:
$ sed 's/ */\t/g' << EOF
a b c
d e f
g h i
EOF
a b c
d e f
g h i
tr:
$ tr -s ' ' '\t' <<EOF
a b c
d e f
g h i
EOF
a b c
d e f
g h i
perl -p -i -e 's/\s+/\t/g' *.txt
এটি একটি খুব সহজ সমাধান:
sed -E 's/\s+/\t/g' your_file > new_file
সেড মূলত এই পদ্ধতিতে কাজ করে (সেডের / পুরানো_প্যাটার্ন / নতুন_প্যাটার্ন / জি ')। এক্ষেত্রে পুরানো প্যাটার্নটি হ'ল "\ s +" যার অর্থ স্পেস "s" এক বা একাধিক সময় "+" এবং পিছনে স্ল্যাশ "\" সন্ধান করুন এটি নিয়মিত অভিব্যক্তি হিসাবে ব্যাখ্যা করে।
নতুন প্যাটার্নটি হল ট্যাব "\ t" যা নিয়মিত অভিব্যক্তি বিন্যাসে লেখা হয় এবং "জি" সমস্ত লাইনে "বিশ্বব্যাপী" প্রতিস্থাপন প্রয়োগ করে।