Score:1

จัดเรียงไฟล์ตามฟิลด์ที่ขึ้นต้นด้วยสตริง

ธง jp

สมมติว่าฉันมีไฟล์ที่มีโครงสร้าง

/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

ฉันต้องการไฟล์ที่จัดเรียงด้วยวิธีนี้:

/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

นั่นคือตามตัวอักษรตามสตริง ผู้เขียน-...

อย่างที่คุณเห็นตำแหน่งของ ผู้เขียน-... ไม่คงที่

ฉันจะทำสิ่งนี้ได้อย่างไร

FedKad avatar
cn flag
คำถามนี้จะน่าสนใจยิ่งขึ้นหากไม่มีตัวคั่น (เช่น `-`) เพื่อเริ่ม "คีย์ 2" ตัวอย่างเช่น เราจะจัดเรียงโดยใช้ชื่อไฟล์ _whole_ ได้อย่างไร
waltinator avatar
it flag
อ่าน `man sort` และหนังสือ "การเรียงลำดับและการค้นหา" ของ Knuth เล่มที่ 4 ของอัลกอริทึมพื้นฐาน
ar flag
หากคุณคิดว่าคำตอบข้อใดข้อหนึ่งถูกต้อง ให้ยอมรับคำตอบโดยคลิกที่เครื่องหมายถูกสีเทา âï¸ ถัดจากคำตอบนั้น และเปลี่ยนให้เป็นสีเขียว â สิ่งนี้จะช่วยผู้อื่น
Score:3
ธง ar

ลองดังต่อไปนี้ ทุบตี สั่งการ:

เรียงลำดับ -t- -d -k2 -o output.txt input.txt

มีสี่ตัวเลือกพร้อมชื่อไฟล์อินพุต อินพุต. txt. หากไฟล์นี้ไม่อยู่ในไดเร็กทอรีปัจจุบัน คุณจะต้องระบุไฟล์ เส้นทาง/ถึง/the/folder/input.txt. ตัวเลือกและข้อโต้แย้งมีดังนี้:

  • -t ทำเครื่องหมายตัวคั่นฟิลด์ เราใช้ - เป็นตัวคั่นเพื่อให้ทุกอย่างก่อนและหลัง - ถือเป็นคอลัมน์ที่แยกจากกัน
  • -d หมายถึงการเรียงลำดับพจนานุกรม ตัวอย่างเช่น Apple อยู่ก่อน Berry
  • -k2 ระบุคอลัมน์ที่จะจัดเรียง ในกรณีนี้คือคอลัมน์ที่สอง โปรดทราบว่าคอลัมน์แรกคือทุกอย่างก่อนคอลัมน์แรก -. ตัวอย่างเช่น, /home/zz/BOOKS/ผู้เขียน. คอลัมน์ที่สองอยู่ระหว่างคอลัมน์แรกและคอลัมน์ที่สอง -, นั่นคือ, อาร์ทิมิส.
  • -o เอาต์พุต. txt เปลี่ยนเส้นทางเอาต์พุตที่เรียงลำดับไปยังไฟล์แทนที่จะไปที่เทอร์มินัล

หวังว่านี่จะช่วยได้

Score:3
ธง hr

แม้ว่าจะเกินความจำเป็นสำหรับตัวอย่างปัจจุบันเนื่องจาก วิธีแก้ปัญหาที่เสนอในคำตอบของ user68186โดยทั่วไปคุณสามารถทำสิ่งนี้ใน GNU awk:

จ้อง -F/ '
  ฟังก์ชัน mycmp(i1,v1,i2,v2) {
    m = แยก (v1,a);
    n = แยก (v2,b);
    กลับ a[m]"" > b[n]"" ? 1 : ก[ม]"" < ข[น]"" ? -1 : 0
  }
  {
    เส้น[NR] = $0
  }
  จบ {
    PROCINFO["sorted_in"] = "mycmp";
    สำหรับ (i ในบรรทัด) เส้นพิมพ์[i]
  }
' ไฟล์

โปรดทราบว่าจะเรียงตามค่าคำศัพท์ของทุกอย่างที่อยู่หลังค่าสุดท้าย / - ดังนั้นหากเป็นรูปแบบ ผู้แต่ง-<ชื่อผู้แต่ง>-<ชื่อเรื่อง>.<นามสกุล> นั่นจะเป็น

  • สตริงคงที่ ผู้เขียน- (ซึ่งไม่มีผลเนื่องจากมีน้ำหนักเท่ากันทุกเส้น); แล้ว
  • <ชื่อผู้เขียน>-; แล้ว
  • <ชื่อเรื่อง>.; แล้ว
  • <extension>

สิ่งนี้คล้ายกับวิธีที่ GNU เรียงลำดับของ KEYDEF อย่างง่าย -t- -k2 ใช้งานได้เช่นคีย์การเรียงลำดับที่มีประสิทธิภาพเริ่มต้นจาก <author name> และไปต่อที่ปลายสาย

ตัวคั่นที่ชัดเจนถูกตัดออกจาก แยก โทรเพื่อให้พวกเขาสืบทอดค่าของ เอฟ.เอสทำให้ง่ายต่อการเปลี่ยนแปลงสำหรับระบบที่ใช้ตัวคั่นเส้นทางอื่น สตริงว่างที่ต่อท้าย "" ใน มายซีเอ็มพี ฟังก์ชันบังคับให้มีการเปรียบเทียบคำศัพท์แม้ว่าชื่อไฟล์จะเป็นตัวเลขก็ตาม ดูตัวอย่าง awk แปลงระหว่างสตริงและตัวเลขอย่างไร


หากคุณต้องการที่จะติดกับ เรียงลำดับ คำสั่ง คุณสามารถใช้ประโยชน์จาก GNU awk ได้ การสื่อสารสองทางกับกระบวนการอื่น ถึง:

  • ทำซ้ำครั้งสุดท้าย /- แยกฟิลด์ที่จุดเริ่มต้นของสตริง
  • ส่งผลลัพธ์ไปยัง เรียงลำดับ คำสั่ง
  • อ่านผลการเรียงลำดับ ลบคำนำหน้าซ้ำแล้วพิมพ์

เช่น.

จ้อง -F/ '
  เริ่มต้น {OFS=FS; cmd = "เรียงลำดับ -d"} 
  {พิมพ์ $NF $0 |& cmd} 
  จบ {
    ปิด (ซม., "ถึง"); 
    ในขณะที่ (cmd |& getline){$1 = ""; พิมพ์};
    ปิด (ซม. "จาก")
  }
' ไฟล์

มีการโกงเล็กน้อยที่นี่ในเส้นทางที่แน่นอน (บรรทัดที่ขึ้นต้นด้วย /) หมายถึงฟิลด์ว่างเริ่มต้น เพื่อจัดการเส้นทางสัมพัทธ์ที่คุณต้องเปลี่ยน พิมพ์ $NF $0 ถึง พิมพ์ $NF,$0 เพื่อแทรกตัวคั่น "ขาดหายไป" จากนั้นอาจใช้ regex ย่อย () แทนที่จะง่ายกว่า $1 = "" เพื่อลบองค์ประกอบนำหน้า

รวมทั้งอาจเร็วกว่า / มีประสิทธิภาพหน่วยความจำมากกว่าแบบเพียว เพ่งพิศ วิธีแก้ปัญหานี้ช่วยให้คนอื่นๆ เรียงลำดับ ตัวเลือกที่จะเพิ่มโดยตรงเช่น cmd = "เรียง -d -t " FS " -k1,1r" .

ar flag
มหัศจรรย์! ฉันไม่ค่อยติดตามสิ่งที่เกิดขึ้นในฟังก์ชัน "mycmp" คุณช่วยชี้ให้ฉันดูเว็บช่วยสอนได้ไหม ขอบคุณ!
hr flag
@user68186 ฟังก์ชันการจัดเรียงแบบกำหนดเองมีการกล่าวถึงในคู่มือผู้ใช้ GNU Awk ที่ [Controlling Array Traversal](https://www.gnu.org/software/gawk/manual/gawk.html#Controlling-Array-Traversal) BTW โปรดเปลี่ยน แสดงความคิดเห็นเป็นคำตอบ!
ar flag
ขอบคุณสำหรับลิงก์ ฉันเข้าใจดีขึ้นเล็กน้อย แต่มีอะไรให้เรียนรู้อีกมากใน `gawk` และตามที่คุณต้องการฉันได้เปลี่ยนความคิดเห็นของฉันเป็นคำตอบ :)
ar flag
+1 สำหรับคำอธิบายเพิ่มเติม! ตอนนี้ t บิตบน `return a[m]"" > b[n]"" ? 1 : น[ม]""
hr flag
@user68186 มันเป็นเพียงสอง [เงื่อนไขแบบไตรภาค](https://www.gnu.org/software/gawk/manual/gawk.html#Conditional-Exp) ในเสื้อกันฝน

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา