Tìm các chuỗi xuất hiện liên tiếp trong một tệp


1

Tất cả,
tôi có một tệp trong đó các chuỗi xuất hiện trên mỗi dòng theo định dạng sau:

STRING1  
STRING2  
STRING1  
STRING1  
STRING1   
STRING3  
STRING4  
STRING4  
STRING5  
STRING6  
STRING5 

Tôi muốn tìm chuỗi nào xuất hiện liên tiếp trong tệp, sử dụng tập lệnh bash. Ví dụ, trong ví dụ trên, STRING1STRING4xuất hiện liên tiếp và sẽ ở đó trong đầu ra. Lưu ý, mặc dù STRING5xuất hiện hai lần, nó không xuất hiện liên tiếp.

Tôi không muốn sắp xếp tệp vì kích thước tệp thường lớn và sẽ thêm chi phí. Người dùng sẽ cung cấp chuỗi và tập lệnh sẽ cho biết nếu chuỗi xuất hiện liên tiếp trong tệp.

FYI, các chuỗi có thể có không gian không mong muốn sau chúng.

Câu trả lời:


4
$ uniq -d <<< 'STRING1
> STRING2
> STRING1
> STRING1
> STRING1
> STRING3
> STRING4
> STRING4
> STRING5
> STRING6
> STRING5'
STRING1
STRING4

Này Ignacio, Cảm ơn đã phản hồi. Tôi đã thử lệnh uniq. Đôi khi, các chuỗi có thể có khoảng trắng sau chúng và trong trường hợp đó, lệnh uniq không tìm thấy các chuỗi xuất hiện liên tiếp.
hút thuốc

2
Vì vậy, sau đó đẩy chúng thông qua một chương trình dải không gian kéo.
Ignacio Vazquez-Abrams

sed 's/ \+$//'
ceving

0
awk -v "key=STRING4" '
    $1 == key && $1 == prev {
        print key " appears on consecutive lines on line " NR
        found=1
        exit 0
    } 
    {prev = $1}
    END {if (! found) {print key " does not appear on consecutive lines"; exit 1}}
' filename

0

Điều gì về so sánh đọc và chuỗi? Có vẻ như là giải pháp dễ nhất với tôi.

while read line; do 
    if [ "$line" == "$temp" ]; then 
        echo "$line"; 
    fi; 
    temp=$line; 
done < test.txt
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.