Score:4

ฉันจะรวมสองไฟล์โดยไม่รวมบรรทัดที่มีอยู่ในทั้งสองไฟล์ได้อย่างไร

ธง it

ฉันมี 2 ไฟล์ที่ไม่สามารถจัดเรียงได้ ทั้งคู่มีรายการคำต่อบรรทัด ฉันกำลังพยายามเปรียบเทียบทั้งสองไฟล์และสร้างไฟล์ใหม่ ปราศจาก บรรทัดที่ซ้ำกันที่จับคู่ระหว่างทั้งสองไฟล์ ซึ่งหมายความว่า หากพบบรรทัดในไฟล์ A ในไฟล์ B ก็ไม่ควรแสดงเป็นผลลัพธ์เอาต์พุต

มีปัญหาใหญ่เกี่ยวกับคำถามและไซต์มากมายที่กล่าวถึงในชื่อเรื่องว่า "การลบรายการที่ซ้ำกัน" ทั้งที่ความจริงแล้วมันคือ "การรวมรายการที่ซ้ำกันและการแสดงรายการที่ไม่ซ้ำ" 2 จุดนี้ต่างกันมาก หนึ่งไม่ได้เป็นการลบบรรทัดที่ซ้ำกัน แต่เป็นการรวมเข้าด้วยกันเท่านั้น

สำหรับกรณีนี้ ฉันจำเป็นต้องลบทิ้งจริงๆ ดังนั้นหากพบในทั้งสองไฟล์จะไม่แสดงเป็นผลลัพธ์

ฉันได้ทดสอบ การสื่อสาร แล้วและสิ่งนี้ล้มเหลว ฉันได้ทดสอบกรณีอื่น ๆ เช่น awk, grep ที่ฉันได้เห็น กฎสำหรับทั้งสองไฟล์มีดังต่อไปนี้:

  • มีขนาดต่างกัน (ห้ามมีจำนวนเส้นเท่ากัน)
  • หากต้องการทำซ้ำ จะเปรียบเทียบทั้งบรรทัดกับแต่ละบรรทัดและบรรทัดอื่นๆ ทั้งหมดในไฟล์อื่น
  • ไม่สามารถจัดเรียงไฟล์ได้

นี่คือข้อมูลบางอย่างเกี่ยวกับไฟล์ พวกเขามีรายการอีเมล หนึ่งอีเมลต่อบรรทัด แน่นอนว่าเนื่องจากขนาดไม่เท่ากัน ไม่ได้หมายความว่าจะมีอีเมลทั้งหมดเหมือนกัน แต่มีอีเมลที่ไม่ซ้ำกันทั้งหมดอยู่ภายใน เป็นเพียงว่าอีเมลบางฉบับอาจอยู่ในทั้งสองไฟล์ สำหรับกรณีที่อีเมลอยู่ในทั้งสองไฟล์ ผลลัพธ์ที่ออกมาไม่ควรแสดงอีเมลเหล่านั้น

FedKad avatar
cn flag
สาเหตุที่ "_ไฟล์ไม่สามารถจัดเรียงได้_" คืออะไร
N0rbert avatar
zw flag
ฉันไม่แน่ใจ แต่คุณสามารถลองใช้ยูทิลิตี้ `dwdiff` เพื่อเปรียบเทียบได้ ดู https://askubuntu.com/a/1073389/66509 สำหรับการอ้างอิง
hr flag
สามารถทำซ้ำ * ภายใน * ไฟล์ใดไฟล์หนึ่งได้หรือไม่ ผลลัพธ์ควรรวมในลำดับใด โปรดพิจารณาให้ตัวอย่างน้อยที่สุด
Luis Alvarado avatar
it flag
@steeldriver ไม่มีการซ้ำกัน (ขอบคุณพระเจ้า) ในแต่ละไฟล์ ล้วนมีเอกลักษณ์เฉพาะตัว)
hr flag
*"หากพบบรรทัดในไฟล์ A ในไฟล์ B บรรทัดนั้นไม่ควรแสดงเป็นผลลัพธ์เอาต์พุต"* ฟังดูเหมือน `grep -vFxf fileB fileA` ในขณะที่ *" หากพบในทั้งสองไฟล์ จะไม่แสดงเป็น ผลลัพธ์"* ฟังดูเหมือน `awk '!seen[$0]++' fileA fileB` นี่คือที่ตัวอย่างสั้น ๆ ที่เป็นตัวแทนจะเป็นประโยชน์
Luis Alvarado avatar
it flag
@steeldriver ขอบคุณเพื่อน ฉันได้ทดสอบทั้งสองอย่างแล้ว แต่ไม่มีโชค พวกเขายังคงแสดงผลผิด ตัวอย่างเช่น ไฟล์หนึ่งมี 700 อีเมล อีกไฟล์หนึ่งมี 80 อีเมล ฉันทราบข้อเท็จจริงที่ว่าอีเมลเกือบทั้ง 80 ฉบับซ้ำกับ 700 อีเมล ดังนั้นจำนวนเอาต์พุตควรอยู่ที่ประมาณ 620 อีเมล
Luis Alvarado avatar
it flag
การแก้ไข ฉันเพิ่งทดสอบตัวที่ 1 อีกครั้ง แต่สังเกตเห็น f ที่ท้าย ฉันทำมันและมันได้ผล แต่ awk ไม่ได้แสดงผลลัพธ์ที่ถูกต้อง แม้ว่า grep ของคุณจะแสดงก็ตาม หากคุณต้องการโปรดใส่คำตอบนี้เนื่องจากสิ่งนี้ใช้งานได้จริงสำหรับฉันหลังจากผ่านไปหลายชั่วโมง
Score:1
ธง cn

มีวิธีที่มีประสิทธิภาพมากกว่า แต่นี่คือ สารละลาย. ฉันไม่แน่ใจว่าคุณต้องการรวมไฟล์อย่างไร ดังนั้น ในโซลูชันนี้ บรรทัดที่แตกต่างจากไฟล์ 1 จะถูกเขียนไปยังไฟล์ใหม่ จากนั้นบรรทัดที่แตกต่างจากไฟล์ 2 จะถูกเขียนไปยังไฟล์ใหม่

#remove_dupes.py
จาก sys นำเข้า argv

infile1 = เปิด ( str(argv[1]), "r" )
infile2 = เปิด ( str(argv[2]), "r" )
พยายาม:
    outfile = เปิด ( str (argv [3]), "w" )
ยกเว้น (IndexError):
    outfile = เปิด ( 'ออก', "w" )


if1_arr = infile1.readlines()
if2_arr = infile2.readlines()
tmp_arr = if2_arr



ยกเว้น = []
สำหรับบรรทัดใน if1_arr:
    ถ้าบรรทัดใน if2_arr:
        ไม่รวม ต่อท้าย (บรรทัด)
    อื่น:
        outfile.write(บรรทัด)

สำหรับบรรทัดใน if2_arr:
    ถ้าบรรทัดไม่รวม:
        outfile.write(บรรทัด)

infile1.close()
infile2.close()
outfile.close()

วิ่ง:

python3 remove_dupes.py <file1> <file2> <output_file>

หากคุณต้องการเปลี่ยนสิ่งนี้ให้เป็นเครื่องมือบรรทัดคำสั่งที่รวดเร็วขึ้น ให้ย้ายสคริปต์ไปยังตำแหน่งระยะยาวและเพิ่มบรรทัดต่อไปนี้ในไฟล์ .bashrc, .bash_aliases, .zshrc หรือเทียบเท่า

นามแฝง mydiff='python3 <path_to_script> '

คุณสามารถแทนที่ 'mydiff' ด้วยสิ่งที่คุณต้องการเรียก หลังจากนั้นคุณสามารถเรียกใช้สคริปต์ด้วย:

mydiff <file1> <file2> <เอาต์พุต_ไฟล์>

โพสต์คำตอบ

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