مرتبکننده خطوط
خطوط را بهصورت الفبایی، بر اساس طول، معکوس یا تصادفی مرتب کنید
خطوط ورودی
خطوط مرتبشده
مرتبسازی خطوط چیست؟
مرتبسازی خطوط فرایند تنظیم مجدد خطوط یک بلوک متنی بر اساس یک قانون مشخص است: ترتیب الفبایی، ترتیب معکوس، طول خط، یا ترتیب تصادفی. مرتبسازی خطوط بهصورت آنلاین یکی از کارهای رایج هنگام کار با فایلهای log، دادههای CSV، فهرستهای پیکربندی، یا هر محتوای متن سادهای است که ترتیب در آن اهمیت دارد. این عملیات متن را بر اساس کاراکترهای خط جدید تقسیم میکند، یک تابع مقایسه را روی آرایه حاصل اعمال میکند و خطوط مرتبشده را دوباره به هم میپیوندد.
اکثر زبانهای برنامهنویسی رشتهها را بهطور پیشفرض با مقایسه لغتنامهای مرتب میکنند که کاراکترها را بر اساس نقطهکد Unicode مقایسه میکند. یعنی حروف بزرگ قبل از حروف کوچک مرتب میشوند ("Banana" قبل از "apple")، و ارقام قبل از حروف قرار میگیرند. مرتبسازی آگاه به زبان، که گاهی natural sort یا collation نامیده میشود، این مشکل را با اعمال قوانین خاص هر زبان برطرف میکند. localeCompare() در JavaScript، locale.strxfrm() در Python، و دستور sort در POSIX با LC_COLLATE همگی مرتبسازی آگاه به زبان را ارائه میدهند.
مرتبسازی بر اساس طول زمانی مفید است که نیاز دارید کوتاهترین یا بلندترین ورودیها در یک فهرست را پیدا کنید، مقادیر غیرعادی در خروجی log را شناسایی کنید، یا موارد را بر اساس پیچیدگی سازماندهی کنید. مرتبسازی معکوس ترتیب موجود خطوط را برمیگرداند بدون اینکه مجدداً مرتب شود، که با مرتبسازی الفبایی 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 |
الگوریتمهای مرتبسازی در پسزمینه
هنگامی که Array.sort() را در JavaScript فراخوانی میکنید، موتور 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