Làm cách nào để so sánh hai tệp với tập lệnh shell?


10

Đưa ra hai tệp, tôi muốn viết một tập lệnh shell đọc từng dòng từ tệp1 và kiểm tra xem nó có trong tệp2 không. Nếu không tìm thấy một dòng, nó sẽ xuất ra hai tệp khác nhau và thoát. Các tập tin có thể chứa số từ hoặc bất cứ điều gì. Ví dụ :

tập tin1:

Hi!
1234
5678
1111
hello

tập tin 2:

1111
5678
1234
Hi!
hello

Trong trường hợp này, hai tập tin nên bằng nhau. nếu file2 có "xin chào !!!" thay vì "xin chào" thì các tập tin lại khác nhau. Tôi đang sử dụng tập lệnh bash. Tôi có thể làm cái này như thế nào. Điều quan trọng là tôi cần phải làm điều đó trong một vòng lặp lồng nhau nhưng đó là điều tôi nghĩ là cách duy nhất. Cảm ơn bạn đã giúp đỡ.

Câu trả lời:


9

Trong bash:

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

Điều gì nếu tập tin là một tập tin csv. sắp xếp vẫn hoạt động?
0x0

sortkhông quan tâm đến nội dung chính xác trừ khi bạn nói với nó.
Ignacio Vazquez-Abrams

Có thể tìm thấy những dòng khác nhau?
0x0

Xóa --briefvà thêm các tùy chọn định dạng, ví dụ -u.
Ignacio Vazquez-Abrams

10

diffđặt trạng thái thoát của nó để cho biết các tệp có giống nhau hay không. Trạng thái thoát có thể truy cập trong biến đặc biệt $?. Bạn có thể mở rộng câu trả lời của Ignacio theo cách này:

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
Bạn chỉ có thể làm if diff ... >/dev/nullmà không có dấu ngoặc và biến.
Tạm dừng cho đến khi có thông báo mới.

1

Thêm điều này bởi vì tôi nghĩ rằng [[]] && || cấu trúc khá gọn gàng:

#!/bin/bash

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

1

Cũng nên làm việc:

comm -3 file1 file2

Tôi nghĩ rằng đây là đủ nhân vật cho một câu trả lời ...


1

Trong khi đó difflà một câu trả lời hoàn toàn tốt, có lẽ tôi sẽ sử dụng cmpthay vào đó là đặc biệt để thực hiện so sánh từng byte của hai tệp.

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

Bởi vì điều này, nó có thêm phần thưởng là có thể so sánh các tệp nhị phân.

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

Tôi tin rằng nó nhanh hơn việc sử dụng diffmặc dù tôi chưa từng thử nghiệm điều đó.


Trường hợp "tập tin là khác nhau" sẽ đi đầu tiên? Kiểm tra if hỏi nếu một cái gì đó là đúng, tức là mã trả về khác không. Nếu các tệp khớp nhau, cmp trả về 0 (trên mỗi trang), và đó sẽ là trường hợp thứ hai.
dùng8162

@ user8162 Những gì bạn nói có ý nghĩa, tuy nhiên tôi vừa thử nó và đó là cách đúng đắn. Tôi không chắc tại sao đó là trường hợp trung thực.
Richard
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.