고정된 문자 수로 bash에서 파일을 읽는 방법은 무엇입니까?

고정된 문자 수로 bash에서 파일을 읽는 방법은 무엇입니까?

그래서 저는 bash를 사용하여 파일을 읽습니다(줄 바꿈, 공백 또는 탭 없이).

이 같은:

aababcbbcbckqkkqkqhddhkehkjhqkjhsdk
skjhqkdjhqkzdhkzhdkjqzhdhqkjhzdkqzh

이 예에는 개행 문자가 있지만 제가 작업 중인 데이터에는 아무것도 없습니다...그래서 기술적으로 모든 것이 "같은 줄"에 있는 것으로 간주된다는 것을 알아냈습니다(개행 문자나 개행 문자가 없기 때문에). 임의의 구분 기호를 사용하여 N개의 문자를 모두 읽으려고 합니다.

while read -N129999 character; do
  program "$character"
done < <(cat file | tr -d '\n')

(나는 "고양이의 쓸모없는 용도"를 안다)

여기서 사용하는 숫자는 read내가 작업할 때 찾은 최대값입니다. (파일을 더 빠르게 처리하기 때문에 이 방법을 선호합니다.) program이는 설명 목적으로만 사용된 예일 뿐입니다. 위 데이터에서 의도적으로 줄 바꿈, 탭 및 공백을 제거했습니다.

이제 내가 제공한 내용은 작동하지만 위보다 적은 숫자를 포함하는 파일의 마지막 부분에서는 제대로 작동하지 않습니다. IFS-n 옵션 에 구분 기호가 제공되면 계속할 수 있지만 문자 범위에 맞지 않는 나머지 파일을 무시하는 대신 ...

(bash, sed 또는 기타 posix 도구에서) 해당 범위에 맞지 않는 나머지 파일/입력을 포함하면서 모든 N 범위의 문자를 어떻게 읽습니까?

답변1

마지막 줄 끝에 개행 문자가 누락된 텍스트 파일을 읽을 때 동일한 문제가 발생합니다. read구분 기호를 보기 전에 파일 끝에 도달하거나 여기에서 필요한 문자 수를 읽지 못한 경우 false 상태를 반환합니다. 즉, 읽어도무엇그것 앞에. 그러나 출력 변수를 설정하므로 null이 아닌지 확인할 수 있습니다.

$ printf abc | while read -N2 x || [ "$x" ] ; do echo "read: $x"; done ;
read: ab
read: c

해당 조건이 없으면 루프가 종료된 후 입력의 마지막 부분이 출력 변수에 나타나는 것을 볼 수 있습니다.

$ printf abc | ( while read -N2 x; do echo "read: $x"; done ; echo "finally: $x" )
read: ab
finally: c

관련된:`읽는 동안 -r 라인 ||은(는) 무슨 뜻인가요? [[ -n $line ]]` 무슨 뜻인가요?

관련 정보