Điểm:1

Sắp xếp tệp theo trường bắt đầu bằng chuỗi

lá cờ jp

Giả sử tôi có một tệp có cấu trúc như vậy

/home/zz/AUTHORBOOKS/Author-Chomsky-Who-Rules-the-World.epub
/home/zz/AUTHORBOOKS/Author-Cioran-Il-nulla.epub
/home/zz/BOOKS/Author-Artemis-Mathematica-Examples.nb
/home/zz/Books/Author-Zigniwe-Hisory-Medicine.pdf
/home/z1/OLDBOOKS1/OLDBOOKS2/Author-Watanabe-Waterloo.pdf
/home/z2/OLDBOOKS1/OLDBOOKS2/Author-Barbero-Lepanto.epub.pdf

Tôi muốn một tập tin được sắp xếp theo cách này:

/home/zz/BOOKS/Author-Artemis-Mathematica-Examples.nb
/home/z2/OLDBOOKS1/OLDBOOKS2/Author-Barbero-Lepanto.epub.pdf
/home/zz/AUTHORBOOKS/Author-Chomsky-Who-Rules-the-World.epub
/home/zz/AUTHORBOOKS/Author-Cioran-Il-nulla.epub
/home/z1/OLDBOOKS1/OLDBOOKS2/Author-Watanabe-Waterloo.pdf
/home/zz/Books/Author-Zigniwe-History-Medicine.pdf

Đó là, theo thứ tự bảng chữ cái, theo chuỗi Tác giả-...

Như bạn có thể thấy vị trí của Tác giả-... không phải là hằng số.

Tôi có thể làm cái này như thế nào?

FedKad avatar
lá cờ cn
Câu hỏi này sẽ thú vị hơn nếu không tồn tại dấu phân cách (như `-`) để bắt đầu "phím 2". Ví dụ: làm thế nào chúng ta có thể sắp xếp bằng cách sử dụng tên tệp _whole_?
waltinator avatar
lá cờ it
Đọc `man sort` và cuốn sách "Sắp xếp và tìm kiếm" của Knuth, tập 4 của Thuật toán cơ bản.
lá cờ ar
Nếu bạn cho rằng một trong các câu trả lời là đúng, hãy chấp nhận câu trả lời bằng cách nhấp vào dấu kiểm màu xám âï¸ bên cạnh câu trả lời đó và chuyển sang màu xanh lục â . Điều này sẽ giúp ích cho những người khác.
Điểm:3
lá cờ hr

Mặc dù nó quá mức cần thiết cho ví dụ hiện tại vì giải pháp được đề xuất trong câu trả lời của user68186, nói chung bạn có thể làm điều gì đó như thế này trong GNU awk:

trố mắt -F/'
  hàm mycmp(i1,v1,i2,v2) {
    m = chia(v1,a);
    n = tách(v2,b);
    trả về a[m]""> b[n]"" ? 1 : a[m]"" < b[n]"" ? -1 : 0
  }
  {
    dòng[NR] = $0
  }
  CHẤM DỨT {
    PROCINFO["sorted_in"] = "mycmp";
    for(i in lines) print lines[i]
  }
' tập tin

Lưu ý rằng nó sắp xếp theo giá trị từ vựng của mọi thứ sau từ cuối cùng / - vì vậy nếu định dạng là Tác giả-<tên tác giả>-<tiêu đề>.<phần mở rộng> đó sẽ là

  • chuỗi cố định Tác giả- (không có tác dụng, vì nó có cùng trọng lượng cho tất cả các dòng); sau đó
  • <tên tác giả>-; sau đó
  • <tiêu đề>.; sau đó
  • <extension>

Điều này tương tự như cách GNU loạiKEYDEF đơn giản -t- -k2 hoạt động tức là khóa sắp xếp hiệu quả bắt đầu từ <author name> và tiếp tục đến cuối dòng.

Một dấu phân cách rõ ràng được bỏ qua từ tách ra các cuộc gọi để họ kế thừa giá trị của FS, giúp dễ dàng thay đổi đối với các hệ thống sử dụng dấu tách đường dẫn khác. Các chuỗi trống nối thêm "" bên trong mycmp chức năng buộc so sánh từ vựng ngay cả khi tên tệp là số - xem ví dụ Cách awk chuyển đổi giữa chuỗi và số


Nếu bạn muốn gắn bó với loại lệnh, bạn có thể tận dụng GNU awk's Truyền thông hai chiều với quy trình khác đến:

  • nhân bản cuối cùng /-trường được phân tách ở đầu chuỗi
  • chuyển kết quả cho a loại chỉ huy
  • đọc lại kết quả đã sắp xếp, loại bỏ tiền tố trùng lặp và in

I E.

trố mắt -F/'
  BẮT ĐẦU {OFS=FS; cmd = "sắp xếp -d"} 
  {in $NF $0 |& cmd} 
  CHẤM DỨT {
    close(cmd,"to"); 
    while(cmd |& getline){$1 = ""; in};
    đóng(cmd,"từ")
  }
' tập tin

Có một chút gian lận ở đây trong đó các đường dẫn tuyệt đối (các dòng bắt đầu bằng /) ngụ ý một trường trống ban đầu; để xử lý các đường dẫn tương đối, bạn cần thay đổi in $NF $0 đến in $NF,$0 để chèn dấu phân cách "bị thiếu" và sau đó có thể sử dụng biểu thức chính quy phụ() thay vì đơn giản hơn $1 = "" để loại bỏ phần tử hàng đầu.

Cũng như có khả năng nhanh hơn/hiệu quả bộ nhớ hơn so với thuần túy trố mắt nhìn giải pháp, điều này cho phép khác loại các tùy chọn được thêm vào một cách đơn giản, ví dụ: cmd = "sắp xếp -d -t " FS " -k1,1r" .

lá cờ ar
Tuyệt vời! Tôi không hoàn toàn theo dõi những gì đang diễn ra trong chức năng "mycmp". Bạn có thể chỉ cho tôi một hướng dẫn web? Cảm ơn!
lá cờ hr
@user68186 các chức năng sắp xếp tùy chỉnh được thảo luận trong Hướng dẫn sử dụng GNU Awk tại [Kiểm soát truyền tải mảng](https://www.gnu.org/software/gawk/manual/gawk.html#Controlling-Array-Traversal) Nhân tiện, vui lòng bật bình luận thành một câu trả lời!
lá cờ ar
Cảm ơn vì liên kết, tôi hiểu nó hơn một chút, nhưng có nhiều điều để tìm hiểu trong `gawk`. Và như bạn mong muốn, tôi đã chuyển nhận xét của mình thành câu trả lời. :)
lá cờ ar
+1 cho lời giải thích bổ sung! Bây giờ, t bit trên `return a[m]"" > b[n]"" ? 1 : a[m]""
lá cờ hr
@user68186 chỉ có hai [điều kiện bậc ba](https://www.gnu.org/software/gawk/manual/gawk.html#Conditional-Exp) trong một chiếc áo choàng
Điểm:3
lá cờ ar

Hãy thử những điều sau đây đánh đập chỉ huy:

sắp xếp -t- -d -k2 -o output.txt input.txt

Nó có bốn tùy chọn cộng với tên của tệp đầu vào đầu vào.txt. Nếu tệp này không có trong thư mục hiện tại, bạn sẽ phải cung cấp đường dẫn/đến/thư mục/input.txt. Các tùy chọn và lập luận của chúng như sau:

  • -t đánh dấu dấu tách trường. Chúng tôi sử dụng - làm dấu phân cách, để mọi thứ trước và sau - được coi là các cột riêng biệt.
  • -d biểu thị sắp xếp từ điển. Ví dụ Apple có trước Berry.
  • -k2 cho biết cột để sắp xếp, trong trường hợp này là cột thứ hai. Lưu ý cột đầu tiên là mọi thứ trước cột đầu tiên -. Ví dụ, /home/zz/SÁCH/Tác giả. Cột thứ hai nằm giữa cột thứ nhất và cột thứ hai -, đó là, Artemis.
  • -o đầu ra.txt chuyển hướng đầu ra được sắp xếp thành một tệp thay vì tới thiết bị đầu cuối.

Hi vọng điêu nay co ich

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.