Cách sắp xếp một tập tin tại chỗ


205

Khi chúng tôi sử dụng sort filelệnh, tệp sẽ hiển thị nội dung của nó theo cách được sắp xếp nếu tôi không muốn nhận bất kỳ loại đầu ra nào ngoài tệp được sắp xếp?


Vui lòng cập nhật câu hỏi của bạn để nói rõ giải thích những gì bạn muốn làm với kết quả sắp xếp tệp. Bạn có muốn sắp xếp nó tại chỗ, thay thế các nội dung chưa được sắp xếp filebằng các nội dung được sắp xếp của cùng một tệp không? Cách câu hỏi của bạn hiện đang được nêu, không làm gì cả là một câu trả lời đúng (bạn không muốn bất kỳ đầu ra nào, vì vậy đừng làm gì cả).
Keith Thompson

@KeithThndry cảm ơn sự quan tâm của bạn thực sự, tôi đã cố gắng sắp xếp một tệp nhưng muốn tránh đầu ra trên màn hình.
Ali Sajid

Vậy bạn muốn đầu ra đi đâu? Vào một tập tin mới? Vào tập tin gốc? Để máy in xuống hội trường?
Keith Thompson

1
Vào tập tin gốc
Ali Sajid

chạy sort infile >outfilevà bạn sẽ nhận được đầu ra được sắp xếp vào tập tin "outfile". Sau đó, bạn có thể xóa "infile" ban đầu và mọi thứ sẽ ổn.
Luis Colorado

Câu trả lời:


406

Bạn có thể sử dụng chuyển hướng tệp để chuyển hướng đầu ra được sắp xếp:

sort input-file > output_file

Hoặc bạn có thể sử dụng -o, --output=FILEtùy chọn loại để chỉ ra cùng một tập tin đầu vào và đầu ra:

sort -o file file

Lưu ý: Một lỗi phổ biến là cố gắng chuyển hướng đầu ra sang cùng một tệp đầu vào (ví dụ sort file > file). Điều này không hoạt động vì shell đang thực hiện các chuyển hướng (không phải chương trình sort (1) ) và tệp đầu vào (cũng là đầu ra) sẽ bị xóa ngay trước khi cho chương trình sort (1) cơ hội đọc nó.


87
Lưu ý tốt về lỗi phổ biến
Drakes

1
Điều này thực sự hữu ích khi bạn cần chỉnh sửa thủ công từ điển cho LaTeX, +1
Bryson S.

6
Chỉ cần đề cập đến tầm quan trọng của trật tự. Từ GNU sorttrang thông tin: -o OUTPUT-FILE' --output = OUTPUT-FILE 'Ghi đầu ra vào OUTPUT-FILE thay vì đầu ra tiêu chuẩn. Trên các hệ thống mới hơn, -o' cannot appear after an input file if POSIXLY_CORRECT 'được đặt, ví dụ: sort F -o F'. Portable scripts should specify -o OUTPUT-FILE' trước bất kỳ tệp đầu vào nào.
Yassine ElBadaoui

14
Để tránh lặp lại tên tệp:sort -o file{,}
tstenner 26/07/18

65

Các sortlệnh in kết quả của hoạt động phân loại để đầu ra tiêu chuẩn theo mặc định. Để đạt được một loại "tại chỗ", bạn có thể làm điều này:

sort -o file file

Điều này ghi đè đầu vào filevới đầu ra được sắp xếp. Công -otắc, được sử dụng để chỉ định đầu ra, được xác định bởi POSIX , do đó nên có sẵn trên tất cả các phiên bản của sort:

-o Chỉ định tên của tệp đầu ra sẽ được sử dụng thay vì đầu ra tiêu chuẩn. Tệp này có thể giống như một trong các tệp đầu vào.

Nếu bạn không may có phiên bản sortkhông có công -otắc ( Luis đảm bảo với tôi rằng chúng tồn tại), bạn có thể đạt được chỉnh sửa "tại chỗ" theo cách tiêu chuẩn:

sort file > tmp && mv tmp file

2
+ ^ cho câu trả lời tốt nhất và với câu hỏi mơ hồ quá, nhưng vẫn ở thứ hạng trang đầu nên cần tăng cường.
u2n

6
sort file | sponge file

Đây là trong gói Fedora sau:

moreutils : Additional unix utilities
Repo        : fedora
Matched from:
Filename    : /usr/bin/sponge

1
Điều này cũng hoạt động trên Ubuntu sau khi cài đặt vớisudo apt install moreutils
Serge Stroobandt

4

Để sắp xếp tệp tại chỗ, hãy thử:

echo "$(sort your_file)" > your_file

Như đã giải thích trong các câu trả lời khác, bạn không thể trực tiếp chuyển hướng đầu ra trở lại tệp đầu vào. Nhưng bạn có thể đánh giá sortlệnh trước và sau đó chuyển hướng nó trở lại tệp gốc. Bằng cách này, bạn có thể thực hiện sắp xếp tại chỗ.

Tương tự, bạn cũng có thể áp dụng thủ thuật này cho các lệnh khác như pasteđể thực hiện nối thêm hàng.


1
Điều này là xấu vì nó sẽ không hoạt động đối với các tệp lớn, dải kết thúc dòng mới, echocó thể gây rối với thoát dấu gạch chéo ngược trong POSIX và -okhông hoạt động cho cùng một tệp như đầu vào như được giải thích tại: stackoverflow.com/a/29244387/895245
Ciro Santilli冠状病六四事件法轮功

4

Đây là một cách tiếp cận (ab) sử dụng vim:

vim -c :sort -c :wq -E -s "${filename}"

Các -c :sort -c :wqlệnh gọi phần để Vim sau khi các tập tin sẽ mở ra. -E-slà cần thiết để vim thực thi trong chế độ "không đầu" mà không rút ra thiết bị đầu cuối.

Điều này gần như không có lợi ích so với sort -o "${filename}" "${filename}"cách tiếp cận ngoại trừ việc nó chỉ lấy đối số tên tệp một lần.


Điều này hữu ích cho tôi để thực hiện một lệnh formattertrong một nanorcmục nhập cho .gitignorecác tệp. Đây là những gì tôi đã sử dụng cho điều đó:

syntax "gitignore" "\.gitignore$"

formatter vim -c :sort -c :wq -E -s

4
Bạn đang sử dụng vim trong của bạn nanorc? Thật trớ trêu.
Brett Holman

2

Bạn có muốn sắp xếp tất cả các tệp trong một thư mục và thư mục con ghi đè chúng không?

Dùng cái này:

find . -type f -exec sort {} -o {} \;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.