대규모 파일 세트에서 특정 텍스트 줄 추출

대규모 파일 세트에서 특정 텍스트 줄 추출

나는 큰 텍스트 파일 세트에서 모든 개별 Unix 명령을 추출하려고 합니다.

이것이 내가 지금까지 가지고 있는 것입니다:

tx이 예에서는 명령의 모든 인스턴스를 추출합니다 . 그 안에는 텍스트 문서가 잔뜩 들어 있고 /PROJECT/DOCS 이름은 모두 입니다 whatever.EXT.

#!/bin/bash

rm -f ~/Documents/proc-search.txt 

cd /PROJECT/DOCS

for file in *

do
 echo "PROC Name: "$file >> ~/Documents/proc-search.txt
 echo "Description:" >> ~/Documents/proc-search.txt
 awk 'NR==1' $file >> ~/Documents/proc-search.txt
 echo "UNIX Commands:" >> ~/Documents/proc-search.txt
 awk '/tx/{print}' $file >> ~/Documents/proc-search.txt
 echo "########################################" >> ~/Documents/proc-search.txt

done

tx나는 proc-search.txt를 열었고 실제로 이 명령의 모든 인스턴스를 캡처했기 때문에 매우 기뻤습니다 . 그러나 명령이 포함되어 있지 않기 때문에 원하지 않는 파일에 대한 정보도 출력합니다 tx. ACPFM.EXT아래 예와 같습니다 . 제외할 수 있는 방법이 있나요?필드파일이 없나요 tx?

이것이 제가 얻은 출력입니다. proc-search.txt입니다. 에 대한 보고서나 .EXT 명령을 ACPFM.EXT사용하지 않는 다른 항목을 보고 싶지 않다는 점을 제외하면 괜찮아 보입니다.tx

PROC Name: 17.EXT
Description:
* NORMPARD (EDIT CONTRL FILE)
UNIX Commands:
# tx @CONTRL                                    <- YAY!  This is a result that I want.
########################################
PROC Name: ACPFM.EXT                            <- I don't want this stanza.
Description:
* ACPFM (Account PARameter File Maintenance)
UNIX Commands:
########################################
PROC Name: ACTDARA.EXT
Description:
*
UNIX Commands:
#tx @SEQFILE                                    <- YAY!  This is a result that I want.
########################################
PROC Name: ACTEDIT.EXT
Description:
*
UNIX Commands:
#tx @SEQFILE                                    <- YAY!  This is a result that I want.
########################################

답변1

당신의 (요약된) 루프

for file in *
do
 echo "PROC Name: "$file >> ~/Documents/proc-search.txt

 awk '/tx/{print}' $file >> ~/Documents/proc-search.txt
 
done

"PROC Name: foo"모든 파일과 일치하는 awk줄만 인쇄합니다 tx.

어쩌면 당신이 원할 수도 있습니다 (디렉토리와 일치하는 것이 없다고 가정 *)

for file in $(grep -l tx *)

이렇게 하면 루프의 모든 파일에 tx문자열이 포함됩니다.

답변2

필요한 것은 다음과 같습니다.

#!/usr/bin/env bash

cd /PROJECT/DOCS &&
awk '
    FNR==1 {
        desc = $0
        doneHdr = 0
    }
    /tx/ {
        if ( !doneHdr++ ) {
            printf "%s", sep
            sep = "########################################" ORS
            print "PROC Name:", FILENAME
            print "Description:" ORS desc
            print "UNIX Commands:"
        }
        print
    }
    END {
        printf "%s", sep
    }
' * > ~/Documents/proc-search.txt

그러나 샘플 입력과 예상 출력이 없으면 이는 테스트되지 않은 추측일 뿐입니다.

답변3

Archemar는 올바른 생각을 가지고 있지만 (내 생각에는) 잘못된 접근 방식을 가지고 있습니다. 나는 간단히 말하고 싶습니다 :

#!/bin/bash

command_name=tx                 # or use "$1" if you want to be able to pass this as an arg

cd /PROJECT/DOCS  &&
for file in *
do
    if grep -q "$command_name" "$file"
    then
        echo "PROC Name: $file"
        echo "Description:"
        head -n1 "$file"
        echo "UNIX Commands:"
        grep "$command_name" "$file"
        echo "########################################"
    fi
done  > ~/Documents/proc-search.txt

관련 정보