While 루프가 파일 중간에 끊어집니다.

While 루프가 파일 중간에 끊어집니다.

텍스트 파일(uniq.txt)을 입력으로 사용하고 grep을 사용하여 다른 파일(stage.txt)에서 중복 항목을 찾은 다음 중복 항목 수와 줄 내용을 다른 File Output.txt에 쓰는 while 루프가 있습니다. .

어떤 이유로 while 루프가 파일 중간에 무작위로 중지됩니까?

while read line; do
            results=$(grep ${line} ./stage.txt | wc -l)
            printf  '%s\n' "$line $results" >> Output.txt
            done < uniq.txt

여기에 문제가 있습니다. 내 while 루프는 -b에서 중지됩니다.

apps
archive.
AWACP
awac-pri
-b
backup
bad_file
bak.path
BasicPlu

답변1

-b이 시점에서는 루프가 option ${line}으로 해석되기 때문에 루프가 중지됩니다 . 이를 방지하려면 더 많은 옵션을 찾지 않도록 를 추가해야 합니다 .-bgrep--grep

results=$(grep -- "$line" ./stage.txt | wc -l)

답변2

문제는 다음과 같은 명령줄 플래그처럼 보이는 값을 가져오는 변수에서 발생합니다.케이 사토가 지적했다..

그러나 당신이 하고 있는 일도 사용될 수 있습니다.

awk 'NR==FNR {p[++i]=$0;next} {for (i in p){if (match($0,p[i])){c[i]++}}} END {for (i in p){print p[i],c[i]}}' uniq.txt stage.txt >output.txt

...패턴 수가 uniq.txt수백만 개가 아닌 경우.

공개된 스크립트 awk:

NR==FNR { p[++i] = $0; next     }

        {
            for (i in p) {
                if (match($0, p[i])) {
                    c[i]++
                }
            }
        }

END     {
            for (i in p) {
                print p[i],c[i]
            }
        }

먼저 각 행을 uniq.txt배열로 읽은 다음 각 패턴을 포함하는 두 번째 파일의 입력 행 수를 p(배열에서) 계산합니다 .cp

마지막으로 패턴과 해당 개수가 출력됩니다.

이것은 방지합니다느린쉘 루프( 각 패턴에 대해 grep한 번 실행하고 wc출력 파일을 여러 번 열고 쓰기)를 사용하지 않아도 됩니다 read.

고정 문자열 일치를 수행하려면, 즉 uniq.txt정규식 패턴이 아닌 고정 문자열( 과 동일 grep -F) 로 행을 처리하려면 match($0, p[i])함수 호출을 로 변경 하면 됩니다 index($0, p[i]).

관련 정보