লাইন সর্টার
লাইনগুলি বর্ণানুক্রমিক, দৈর্ঘ্য অনুযায়ী, বিপরীত বা র্যান্ডমলি সাজান
ইনপুট লাইন
সাজানো লাইন
লাইন সাজানো কী?
লাইন সাজানো হলো একটি নির্দিষ্ট নিয়ম অনুযায়ী একটি টেক্সট ব্লকের লাইনগুলি পুনর্বিন্যস্ত করার প্রক্রিয়া: বর্ণানুক্রমিক ক্রম, বিপরীত ক্রম, লাইনের দৈর্ঘ্য, বা র্যান্ডম শাফল। অনলাইনে লাইন সাজানো একটি সাধারণ কাজ যখন লগ ফাইল, CSV ডেটা, কনফিগারেশন তালিকা, বা যেকোনো সাধারণ-টেক্সট বিষয়বস্তুর সাথে কাজ করা হয় যেখানে ক্রম গুরুত্বপূর্ণ। এই প্রক্রিয়া নিউলাইন ক্যারেক্টার দিয়ে টেক্সট ভাগ করে, ফলাফলের অ্যারেতে একটি কম্পারেটর ফাংশন প্রয়োগ করে, এবং সাজানো লাইনগুলি পুনরায় একত্রিত করে।
বেশিরভাগ প্রোগ্রামিং ভাষা ডিফল্টভাবে লেক্সিকোগ্রাফিক তুলনা ব্যবহার করে স্ট্রিং সাজায়, যা তাদের Unicode কোড পয়েন্ট অনুযায়ী ক্যারেক্টার তুলনা করে। এর মানে বড় হাতের অক্ষর ছোট হাতের আগে আসে ("Banana" "apple"-এর আগে), এবং সংখ্যা অক্ষরের আগে আসে। লোকেল-সচেতন সাজানো, যাকে কখনো কখনো ন্যাচারাল সর্ট বা কোলেশন বলা হয়, ভাষা-নির্দিষ্ট নিয়ম প্রয়োগ করে এটি ঠিক করে। JavaScript-এর localeCompare(), Python-এর locale.strxfrm(), এবং LC_COLLATE সহ POSIX sort কমান্ড সবই লোকেল-সচেতন ক্রম প্রদান করে।
দৈর্ঘ্য অনুযায়ী সাজানো তখন কাজে আসে যখন একটি তালিকার সবচেয়ে ছোট বা দীর্ঘ এন্ট্রি খুঁজে বের করতে হয়, লগ আউটপুটে অস্বাভাবিক মান শনাক্ত করতে হয়, বা জটিলতা অনুযায়ী আইটেম সংগঠিত করতে হয়। বিপরীত সাজানো পুনরায় ক্রমবিন্যাস না করে বিদ্যমান লাইন ক্রম উল্টে দেয়, যা Z-A বর্ণানুক্রমিক সাজানো থেকে আলাদা। র্যান্ডম শাফলিং প্রতিটি লাইনে একটি র্যান্ডম সর্ট কী নির্ধারণ করে, প্রতিটি চালনায় ভিন্ন ক্রম তৈরি করে। একই ইনপুটে মোড পরিবর্তন করা একটি এককালীন স্ক্রিপ্ট লেখার চেয়ে দ্রুত।
কেন এই লাইন সর্টার ব্যবহার করবেন?
আপনার টেক্সট পেস্ট করুন, একটি সর্ট মোড বেছে নিন, এবং তাৎক্ষণিকভাবে ফলাফল পান। কোনো কমান্ড-লাইন সেটআপ নেই, কোনো স্ক্রিপ্ট ফাইল নেই, কোনো প্যাকেজ ইনস্টলেশন নেই।
লাইন সর্টারের ব্যবহারের ক্ষেত্র
লাইন সর্ট মোড রেফারেন্স
এই টুল ছয়টি সর্ট মোড সমর্থন করে। নিচের সারণি প্রতিটি মোড, এটি যে তুলনা পদ্ধতি ব্যবহার করে, এবং ইনপুট তালিকার জন্য একটি নমুনা ফলাফল বর্ণনা করে: apple, banana, cherry, date, fig।
| মোড | বিবরণ | JS পদ্ধতি | উদাহরণ আউটপুট |
|---|---|---|---|
| A-Z | Alphabetical ascending | localeCompare() | apple, banana, cherry |
| Z-A | Alphabetical descending | localeCompare() reversed | cherry, banana, apple |
| Length (short) | Shortest line first | a.length - b.length | fig, date, apple, banana |
| Length (long) | Longest line first | b.length - a.length | banana, apple, date, fig |
| Reverse | Flip line order, no reordering | Array.reverse() | Last line becomes first |
| Random | Randomized comparator (biased) | Math.random() - 0.5 | Different every run |
পর্দার আড়ালে সাজানোর অ্যালগরিদম
JavaScript-এ Array.sort() কল করলে V8 ইঞ্জিন (Chrome, Node.js) ২০১৯ সাল থেকে Timsort ব্যবহার করে। অন্যান্য রানটাইম ভিন্ন অ্যালগরিদম ব্যবহার করে। নিচের সারণি ভাষা স্ট্যান্ডার্ড লাইব্রেরিতে ব্যবহৃত সবচেয়ে সাধারণ সাজানোর অ্যালগরিদম তুলনা করে। সবই এই টুলের লাইন-সাজানোর কাজ সাধারণ ইনপুটের জন্য (১,০০,০০০ লাইনের কম) এক মিলিসেকেন্ডেরও কম সময়ে সম্পন্ন করে।
| অ্যালগরিদম | ব্যবহারকারী | সময় | নোট |
|---|---|---|---|
| Timsort | Python, Java (Arrays.sort) | O(n log n) | Stable, fast on partially sorted data |
| Quicksort | C stdlib, V8 (older) | O(n log n) | In-place, unstable by default |
| Merge sort | Most stable-sort implementations | O(n log n) | Stable, predictable, uses extra memory |
| Introsort | C++ std::sort, .NET | O(n log n) | Hybrid: quicksort + heapsort fallback |
| Radix sort | Fixed-length keys, integers | O(nk) | Non-comparative, linear for short keys |
কোড উদাহরণ
JavaScript, Python, Go, এবং কমান্ড লাইনে প্রোগ্রামেটিকভাবে লাইন সাজান। প্রতিটি উদাহরণে বর্ণানুক্রমিক, দৈর্ঘ্য-ভিত্তিক, এবং বিপরীত সাজানো অন্তর্ভুক্ত রয়েছে।
const text = `banana
apple
cherry
date
fig`
// Sort A-Z (locale-aware)
const az = text.split('\n').sort((a, b) => a.localeCompare(b)).join('\n')
// → "apple\nbanana\ncherry\ndate\nfig"
// Sort by line length, shortest first
const byLen = text.split('\n').sort((a, b) => a.length - b.length).join('\n')
// → "fig\ndate\napple\nbanana\ncherry"
// Reverse line order (no alphabetical sorting)
const reversed = text.split('\n').reverse().join('\n')
// → "fig\ndate\ncherry\napple\nbanana"
// Remove duplicates and sort
const unique = [...new Set(text.split('\n'))].sort().join('\n')text = """banana apple cherry date fig""" lines = text.splitlines() # Sort A-Z (case-insensitive) az = sorted(lines, key=str.lower) # → ['apple', 'banana', 'cherry', 'date', 'fig'] # Sort by line length by_len = sorted(lines, key=len) # → ['fig', 'date', 'apple', 'banana', 'cherry'] # Reverse original order rev = lines[::-1] # → ['fig', 'date', 'cherry', 'apple', 'banana'] # Shuffle randomly import random random.shuffle(lines) # modifies in place
package main
import (
"fmt"
"sort"
"strings"
)
func main() {
text := "banana\napple\ncherry\ndate\nfig"
lines := strings.Split(text, "\n")
// Sort A-Z
sort.Strings(lines)
fmt.Println(strings.Join(lines, "\n"))
// → apple\nbanana\ncherry\ndate\nfig
// Sort by length
sort.Slice(lines, func(i, j int) bool {
return len(lines[i]) < len(lines[j])
})
fmt.Println(strings.Join(lines, "\n"))
// → fig\ndate\napple\nbanana\ncherry
}# Sort lines A-Z
sort file.txt
# Sort lines Z-A (reverse)
sort -r file.txt
# Sort numerically (first field)
sort -n data.txt
# Sort by line length (awk + sort + cut)
awk '{ print length, $0 }' file.txt | sort -n | cut -d' ' -f2-
# Shuffle lines randomly
shuf file.txt # GNU coreutils
sort -R file.txt # alternative (not truly uniform)
# Sort and remove duplicates
sort -u file.txt