เรียงลำดับชุดของบรรทัดตามตัวอักษร


3

หมายเหตุ: คำถามที่สมบูรณ์อยู่ที่นี่: วิธีการจัดเรียงบรรทัดภายใน "chunks" หลายรายการคั่นด้วยส่วนหัวได้อย่างไร


ดังนั้นสิ่งที่ฉันพบคำตอบคือวิธีการเรียงลำดับบรรทัดในไฟล์ข้อความตามลำดับตัวอักษร แต่มันไม่ใช่สิ่งที่ฉันต้องทำ ฉันมีไฟล์นี้พร้อมโพรไฟล์ที่ประกอบด้วย 15 พารามิเตอร์ที่แตกต่างกันซึ่งเข้าสู่เครื่องมือในที่ทำงานและเครื่องถูกอ่านเพื่อให้มีรายการโปรไฟล์

น่าเสียดายที่การจัดรูปแบบของไฟล์นี้มีลักษณะดังนี้:

[ProfileB]
param1=z
param2=y
param3=x
[ProfileA]
param1=k
param2=l
param3=

และฉันต้องการจัดเรียงโปรไฟล์ตามลำดับตัวอักษร แต่ฉันต้องการให้พวกเขาอยู่กลุ่มกับพารามิเตอร์ของพวกเขา ตัวอย่างด้านบนควรได้รับการจัดเรียงดังนี้:

[ProfileA]
param1=k
param2=l
param3=
[ProfileB]
param1=z
param2=y
param3=x

ฉันเดาว่ามีบางสิ่งบางอย่างในการทำงานกับจำนวนบรรทัดคงที่ (ชื่อ + พารามิเตอร์) หรือด้วยอักขระ "[" เป็นตัวระบุสำหรับการเริ่มต้นของกลุ่มของบรรทัด

แต่นี่เกินความสามารถของฉันในการจัดการข้อความ ฉันมีที่จำหน่ายของฉันทั้งคอนโซลคำสั่ง Sublime Text, R หรือ Linux


"เครื่องดนตรี" จำเป็นต้องมีการเรียงลำดับโปรไฟล์หรือไม่?
เกล็นแจ็คแมน

2
ฉันหวังว่าใครบางคนสามารถช่วยคุณได้ แต่ในขณะเดียวกันคุณควรเรียนรู้ภาษาที่ตีความไม่หนักหนาเท่าภาษา C และไม่เป็นเรื่องตลก บางอย่างเช่นทับทิมหรือหลามหรือ Perl
barlop

@glennjackman ไม่ แต่ถ้าไฟล์ไม่ได้เรียงลำดับโปรไฟล์จะถูกโหลดตามลำดับเดียวกับไฟล์ในไฟล์
Paul Giroud

1
@barlop ฉันจะมีพื้นฐานในหลามและ Perl และฉันยินดีที่จะใช้พวกเขา (ซึ่งเป็นสิ่งที่ผมหมายถึงการเข้าถึงคอนโซลคำสั่ง)
พอลชิรูด์

คำตอบ:


3

สิ่งนี้ใช้ได้ใน Debian ของฉัน:

sed '1 ! s/^\[/\x00\[/g' | sort -z | tr -d "\0"

หากต้องการทำงานกับไฟล์ให้ใช้การเปลี่ยนเส้นทางเช่น{ sed … ; } <input.txt >output.txtที่sed …คำสั่งทั้งหมดอยู่ที่ไหน

ขั้นตอนดังต่อไปนี้:

  1. sedแทรกอักขระ null ก่อนทุกอักขระ[ที่อยู่ในจุดเริ่มต้นของบรรทัดยกเว้นว่าบรรทัดคืออักขระแรก วิธีนี้อักขระ null จะแยกโปรไฟล์
  2. sort -z ใช้อักขระ null เหล่านี้เป็นตัวคั่นดังนั้นจึงเรียงลำดับโปรไฟล์ทั้งหมดไม่ใช่เส้นแยก
  3. tr ลบอักขระ null

ไม่มีการร้องเรียนฉันได้รับไฟล์ ouput เมื่อฉันลบfilterส่วนเพื่อทำความเข้าใจว่าเกิดอะไรขึ้น ฉันไม่ได้มีคำสั่งทั้งหมด
Paul Giroud

1
ฉันคิดว่าฉันมีปัญหาและอาจเป็นเพราะฉันยังไม่ชัดเจนเกี่ยวกับสิ่งที่ฉันต้องการจะทำ โซลูชันของคุณกำลังเรียงลำดับบรรทัดทั้งหมดในโปรไฟล์ (สิ่งที่ฉันเรียกว่า param1, param2 และ param3 ในตัวอย่างของฉัน) ตามลำดับตัวอักษร แต่จะรักษาลำดับดั้งเดิมของโปรไฟล์ (ถ้าโปรไฟล์แรกในรายการคือ [B] และที่สอง [A] มันจะอยู่แบบนี้) สิ่งที่ฉันต้องการคือการเรียงลำดับชื่อโปรไฟล์ไม่ใช่พารามิเตอร์ที่มี (ซึ่งเรียงลำดับตามตัวอักษรอยู่แล้ว)
Paul Giroud

ฉันแย่แล้วขอโทษภาษาอังกฤษไม่ใช่ภาษาแรกของฉันและฉันทำผิดพลาดในการค้นหาของฉัน! ขอบคุณมาก
Paul Giroud

0

นี่เป็นสคริปต์ Perl ขนาดเล็กที่ทำงาน:

my %profiles;
my $profile;

while (<>) {
    if (/\[(.+)\]/) {
        $profile = $1;
        next;
    }
    next if !defined $profile;

    chop if /\n$/;
    push @{ $profiles{$profile} }, $_;
}

foreach my $key (sort keys %profiles) {
    print "[$key]\n";
    foreach my $line (sort @{ $profiles{$profile} }) {
        print "$line\n";
    }
}

บันทึกเป็นไฟล์sortProfiles.plตัวอย่างและเรียกใช้:

perl sortProfiles.pl <inputFile.txt >outputFile.txt

มันทำงานอย่างไร

  1. มันอ่านไฟล์อินพุต ( while (<>))
  2. สำหรับแต่ละโปรไฟล์[profile]ในอินพุตไฟล์มันจะจดจำชื่อของมันใน$profileตัวแปร
  3. มันจะบันทึกแต่ละบรรทัดตามส่วนหัวโปรไฟล์ภายในอาร์เรย์
  4. จากนั้นมันจะเรียงกุญแจของ%profilesกัญชา
  5. นอกจากนี้ยังเรียงลำดับบรรทัดภายในอาร์เรย์อีกด้วย

ในสคริปต์%profilesนี้มีแฮช คีย์ของมันเป็นชื่อรายละเอียดค่านิยมที่มีอาร์เรย์ของเส้น
ดังนั้น@{ $profiles{$profile} }เป็นอาร์เรย์ที่เก็บบรรทัดสำหรับชื่อโปรไฟล์ใน$profileตัวแปร


ผมคิดว่านี่เป็นคำตอบทั้งสองคำถามนี้และหนึ่งฟรี
Alexey Ivanov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.