나는 이것을 자주 하지 않으며, 할 때 항상 시간에 매우 민감합니다. 백만 개가 넘는 파일에서 숫자 패턴을 추출하는 다음 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)
}
' '{}' +