텍스트 파일(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}
으로 해석되기 때문에 루프가 중지됩니다 . 이를 방지하려면 더 많은 옵션을 찾지 않도록 를 추가해야 합니다 .-b
grep
--
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
(배열에서) 계산합니다 .c
p
마지막으로 패턴과 해당 개수가 출력됩니다.
이것은 방지합니다느린쉘 루프( 각 패턴에 대해 grep
한 번 실행하고 wc
출력 파일을 여러 번 열고 쓰기)를 사용하지 않아도 됩니다 read
.
고정 문자열 일치를 수행하려면, 즉 uniq.txt
정규식 패턴이 아닌 고정 문자열( 과 동일 grep -F
) 로 행을 처리하려면 match($0, p[i])
함수 호출을 로 변경 하면 됩니다 index($0, p[i])
.