ฉันจะเปรียบเทียบสองไฟล์กับเชลล์สคริปต์ได้อย่างไร


10

ให้สองไฟล์ฉันต้องการเขียนเชลล์สคริปต์ที่อ่านแต่ละบรรทัดจาก file1 และตรวจสอบว่ามีใน file2 หรือไม่ หากไม่พบบรรทัดมันควรเอาท์พุทสองไฟล์ต่างกันและออก ไฟล์สามารถมีหมายเลขคำหรืออะไรก็ได้ ตัวอย่างเช่น :

ไฟล์ 1:

Hi!
1234
5678
1111
hello

file2:

1111
5678
1234
Hi!
hello

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

คำตอบ:


9

ในทุบตี:

diff --brief <(sort file1) <(sort file2)

เกิดอะไรขึ้นถ้าไฟล์นั้นเป็นไฟล์ csv การเรียงลำดับจะยังคงทำงานได้หรือไม่
0x0

sortไม่สนใจเนื้อหาที่แน่นอนเว้นแต่คุณจะบอก
Ignacio Vazquez-Abrams

เป็นไปได้ไหมที่จะเห็นว่าบรรทัดไหนที่แตกต่างกัน?
0x0

ลบและเพิ่มตัวเลือกรูปแบบเช่น--brief -u
Ignacio Vazquez-Abrams

10

diffตั้งค่าสถานะออกเพื่อระบุว่าไฟล์เหมือนกันหรือไม่ $?สถานะออกสามารถเข้าถึงได้ในตัวแปรพิเศษ คุณสามารถขยายคำตอบของ Ignacio ด้วยวิธีนี้:

diff --brief <(sort file1) <(sort file2) >/dev/null
comp_value=$?

if [ $comp_value -eq 1 ]
then
    echo "do something because they're different"
else
    echo "do something because they're identical"
fi

3
คุณสามารถทำได้if diff ... >/dev/nullโดยไม่ต้องวงเล็บและตัวแปร
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

1

กำลังเพิ่มสิ่งนี้เพราะฉันคิดว่า [[]] && || โครงสร้างค่อนข้างเรียบร้อย:

#!/bin/bash

[[ `diff ${HOME}/file1 ${HOME}/file2` ]] &&  
   (echo "files different") ||
   (echo "files same")

1

ควรทำงาน:

comm -3 file1 file2

ฉันคิดว่านี่เป็นตัวละครที่เพียงพอสำหรับคำตอบ ...


1

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

https://linux.die.net/man/1/cmp

ด้วยเหตุนี้จึงมีโบนัสเพิ่มความสามารถในการเปรียบเทียบไฟล์ไบนารี

if cmp -s "file1" "file2"
then
   echo "The files match"
else
   echo "The files are different"
fi

ฉันเชื่อว่ามันเร็วกว่าการใช้diffแม้ว่าฉันจะไม่ได้ทำการทดสอบเป็นการส่วนตัว


กรณี "ไฟล์แตกต่างกัน" จะไม่ไปก่อนหรือไม่ การทดสอบ if ถามว่ามีอะไรจริงหรือไม่นั่นคือโค้ดส่งคืนที่ไม่ใช่ศูนย์ หากไฟล์ตรงกัน cmp ส่งคืนค่า 0 (ต่อ manpage) และอื่น ๆ ควรเป็นกรณีที่สอง
user8162

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