AWK 또는 스크립트를 통한 텍스트 처리로 대용량 파일 관리

AWK 또는 스크립트를 통한 텍스트 처리로 대용량 파일 관리

@Ed Morton에 응답,

입력하다

...
useless_words Number_100 : Message xx Dublin xx Paris useless_words -Code 452 useless_words
useless_words Number_100 : Rename message (old 452 ; new 557)
useless_words Number_100 : Message xx Dublin xx Paris useless_words -Code 557 useless_words
useless_words Number_101 : Message xx Toronto xx Rio useless_words -Code 842 useless_words
useless_words Number_102 : Message xx Rome xx Moscow useless_words -Code 432 useless_words
useless_words Number_103 : Message from Dublin to Paris -Code 557
useless_words Number_103 : Error Message
...
useless_words Number_110 : Message xx Alger xx Barcelona useless_words -Code 345 useless_words
useless_words Number_110 : Rename message (old 345 ; new 846)
useless_words Number_110 : Message xx Alger xx Barcelona useless_words -Code 846 useless_words
useless_words Number_111 : Message xx Mexico xx Dallas useless_words -Code 498 useless_words
useless_words Number_112 : Rename message (old 432 ; new 245)
...
useless_words Number_115 : Message from Alger to Barcelona -Code 846
useless_words Number_115 : Error Message
...

산출

useless_words Number_100 : Message xx Dublin xx Paris useless_words -Code 452 useless_words
useless_words Number_100 : Message xx Dublin xx Paris useless_words -Code 557 useless_words
useless_words Number_100 : Message from Dublin to Paris -Code 557
useless_words Number_110 : Message xx Alger xx Barcelona useless_words -Code 345 useless_words
useless_words Number_110 : Message xx Alger xx Barcelona useless_words -Code 846 useless_words
useless_words Number_110 : Message from Alger to Barcelona -Code 846

이를 위해 다음 단계를 따르고 싶습니다.

    1. 오류 메시지가 포함된 줄과 일치합니다 => 메시지 번호를 얻습니다(여기서는 Number_103 및 Number_115).
    1. 숫자(Number_103 및 Number_115)가 포함된 행을 검색하고 3개의 단어를 선택합니다(이 경우 $6 $8 $10 => Dublin Paris 557; Alger Barcelona 846). 나는 그 줄을 인쇄한다. 첫 번째 메시지를 받았습니다.
    1. 이 3개 단어와 일치하는 행을 검색하고 메시지 번호(여기서는 Number_100 및 Number_110)를 기록해 둡니다. 이 줄을 인쇄합니다. 두 번째 메시지를 받았습니다.
    1. 마지막으로 인쇄된 메시지(여기서는 Number_100 및 Number_110)와 동일한 메시지 번호를 가진 이름이 바뀐 메시지를 검색하고 이전 키(여기서는 345 및 452)를 가져옵니다.
    1. 이전 키(여기서는 345 및 452)와 메시지 번호(여기서는 Number_100 및 Number_110)로 인쇄할 마지막 메시지를 검색합니다.
    1. 인쇄된 첫 번째 메시지의 메시지 번호를 수정합니다(번호_103 -> 번호_100; 번호_115 -> 번호_110).

내가 쓴 것은

#!bin/bash
            
    grep -B1 'Error' inputs.txt |sed '/^-/d' | sed '/^$/d' | grep -v Error >> tmp_01.txt
    
    while read line
    do  
    
    read a b c <<< $(echo $line | cut -d' ' -f6,8,10)
    
    awk -v a1="$a" -v a2="$b" -v a3="$c" '$0~a1 && $0~a2 && $0~a3' inputs.txt >> tmp_02.txt
    
    done < tmp_01.txt
    
    awk '{++i} i==1 {a=$2} i==2 {$2=a; i=0} 1' tmp_02.txt
    
    rm -f tmp_*.txt

알겠어요

useless_words Number_100 : Message xx Dublin xx Paris useless_words -Code 557 useless_words
useless_words Number_100 : Message from Dublin to Paris -Code 557
useless_words Number_110 : Message xx Alger xx Barcelona useless_words -Code 846 useless_words
useless_words Number_110 : Message from Alger to Barcelona -Code 846

코드를 빨리 얻으려고 노력했어요. Bodo님의 도움 덕분이에요!

사실 BOX로 보낸 메시지가 다른 곳으로 전송되었습니다(번호는 동일합니다_).

useless_words Number_100 : Message xx Dublin xx Paris useless_words -Code 452 useless_words

useless_words Number_100 : Rename message (old 452 ; new 557)

useless_words Number_100 : Message xx Dublin xx Paris useless_words -Code 557 useless_words

그런 다음 ACK를 BOX(다른 번호_)로 보냈습니다.

useless_words Number_103 : Message from Dublin to Paris -Code 557

일반적으로 BOX에서 수신한 이 ACK는 다른 BOX로 전송되지만 때때로 이 ACK가 차단되는 경우가 있는데 오류 메시지가 표시되는 경우도 마찬가지입니다.

useless_words Number_103 : Error Message

답변1

수정된 질문과 의견에서 요청한 대로 이 답변은 추가 문제를 수정하지 않고 질문의 스크립트와 동일한 결과를 생성하는 더 빠른 스크립트를 만들려는 시도입니다.

제안된 스크립트는 오류 메시지 수에 관계없이 입력 파일을 두 번만 처리합니다.

하지만이것이 질문에 표시된 출력을 얻기 위해 수정하는 더 나은 기반인지 잘 모르겠습니다. ("먼저 작동하게 만들고, 빠르게 만들지 말고, 그 반대도 하지 말라"는 규칙이 있습니다.)

grep -B1 'Error' file.txt |sed '/^-/d' | sed '/^$/d' | grep -v Error| awk '{printf "/%s/ && /%s/ && /%s/\n", $6, $8, $10}' > filter.awk
awk -f filter.awk file.txt

awk아니면 스크립트를 파일에 쓰지 마세요

awk -f <(grep -B1 'Error' file.txt |sed '/^-/d' | sed '/^$/d' | grep -v Error| awk '{printf "/%s/ && /%s/ && /%s/\n", $6, $8, $10}') file.txt

또는 아닙니다 (그리고 예제 입력에는 불필요한 것으로 보이는 grep동등한 명령이 없습니다 )sed

awk -f <(awk '/Error/ && prev {$0=prev;printf "/%s/ && /%s/ && /%s/\n", $6, $8, $10;next} {prev=$0}' file.txt) file.txt

답변2

질문의 예제 입력을 변경한 후에는 여기의 솔루션이 더 이상 작동하지 않습니다.설명이 필요합니다.

입력 형식의 사양이 불분명합니다.

이 스크립트는 질문의 원래 예제 입력을 기반으로 예상되는 출력을 인쇄합니다.

awk '/Number_[0-9]* : Message .* -Code [0-9]* ./ { if($2 != first) i=0; line[i++]=$0; first=$2;}
/Number_[0-9]* : Message from .* -Code [0-9]*$/ { second=$2; sub(second,first); line[i++]=$0}
/Number_[0-9]* : Error Message/ && (second==$2) { print line[0]; print line[1]; print line[2];}' input

-Code스크립트는 첫 번째 경우의 숫자 뒤에 공백과 문자를 예상하고 두 번째 경우의 줄 끝에 있는 숫자를 예상하여 첫 번째 경우와 두 번째 경우를 구분합니다.

원래 입력은

...
useless_words Number_98 : useless message
useless_words Number_99 : useless message
useless_words Number_100 : Message xx Dublin xx Paris useless_words -Code 452 useless_words
useless_words Number_100 : Rename message (old 452 ; new 557)
useless_words Number_100 : Message xx Dublin xx Paris useless_words -Code 557 useless_words
useless_words Number_101 : useless message
useless_words Number_102 : useless message
useless_words Number_103 : Message from Dublin to Paris -Code 557
useless_words Number_103 : Error Message
...
useless_words Number_110 : Message xx Alger xx Barcelona useless_words -Code 345 useless_words
useless_words Number_110 : Rename message (old 345 ; new 846)
useless_words Number_110 : Message xx Alger xx Barcelona useless_words -Code 846 useless_words
useless_words Number_111 : useless message
...
useless_words Number_115 : Message from Alger to Barcelona -Code 846
useless_words Number_115 : Error Message
...

산출

useless_words Number_100 : Message xx Dublin xx Paris useless_words -Code 452 useless_words
useless_words Number_100 : Message xx Dublin xx Paris useless_words -Code 557 useless_words
useless_words Number_100 : Message from Dublin to Paris -Code 557
useless_words Number_110 : Message xx Alger xx Barcelona useless_words -Code 345 useless_words
useless_words Number_110 : Message xx Alger xx Barcelona useless_words -Code 846 useless_words
useless_words Number_110 : Message from Alger to Barcelona -Code 846

질문을 수정한 후 수정하세요.

이제 "낭비 라인"이 잠재적으로 흥미로운 라인과 동일한 형식을 갖기 때문에 스크립트는 더 이상 수정된 입력에서 작동하지 않습니다.

이 스크립트를 수정하려면 잠재적으로 흥미로운 줄과 쓸모없는 줄을 구별하는 기준이 필요하거나 스크립트가 Error Message.

이 문제에 대한 명확한 설명을 요청합니다.

관련 정보