AWK에 Sed 스크립트

AWK에 Sed 스크립트

나는 이것을 자주 하지 않으며, 할 때 항상 시간에 매우 민감합니다. 백만 개가 넘는 파일에서 숫자 패턴을 추출하는 다음 sed 스크립트가 있습니다. 이것을 AWK로 보내야 하므로 일치하는 패턴이 발견되면 발견된 파일 이름이 인쇄됩니다. 행 수가 많아지지만 너무 욕심을 부리지는 마세요.

원하는 출력

파일 이름 1 000-323423-33

파일 이름 2 000-323423-33

파일 이름 3 000-323423-33

다양한 방법을 시도했지만 아무 소용이 없습니다. 경험이 있는 사람이 나에게 올바른 지침을 제공할 수 있습니까? 미리 감사드립니다!

#!/bin/sh

#shopt -s nullglob
FILES=/mnt/c/temp/1/*.txt
for f in $FILES

do
    echo "Processing $f"
    sed -nr \
        -e '/[0-9]{3}-[0-9]{6}-[0-9]{2}/{
            s/.*([0-9]{3}\-[0-9]{6}\-[0-9]{2}).*/\1/
            G
            p 
            }' $f 
done

답변1

당신이 하고 있는 일 이 바로 당신의 임무인 것 같습니다 grep. 콜론이 정말로 필요하지 않은 경우 tr파일 이름에 콜론이 없다고 가정하고 를 사용하여 콜론을 공백으로 바꾸십시오.

grep -Eon '[0-9]{3}-[0-9]{6}-[0-9]{2}' *.txt | tr ':' ' '

출력은 다음과 유사합니다.

file1 10 000-323423-33
file2 20 000-323423-34
file3 30 000-323423-35
file3 31 000-323423-36

답변2

@thanasisp가 맞습니다. grep해당 작업에 이상적입니다.

awk를 사용하면 다음과 같이 작성할 수 있습니다.

awk -v OFS=, '
  match($0, /[0-9]{3}-[0-9]{6}-[0-9]{2}/) {
    print FILENAME, FNR, substr($0, RSTART, RLENGTH)
  }
' /mnt/c/temp/1/*.txt

인용하다:https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html

파일이 너무 많으면 "매개변수 목록이 너무 김" 오류가 발생할 수 있습니다. 이때 당신에게 필요한find

find /mnt/c/temp/1/ -type f -name '*.txt' -exec awk -v OFS=, '
  match($0, /[0-9]{3}-[0-9]{6}-[0-9]{2}/) {
    print FILENAME, FNR, substr($0, RSTART, RLENGTH)
  }
' '{}' +

관련 정보