다음과 같은 수백 줄의 시퀀스가 포함된 텍스트 파일이 있습니다.
B29. B52. 84쯤. 83쯤. 94쯤. 93쯤. 61 정도. B38. 81쯤. 92 정도. 28쯤. c 37. 27쯤. lara@batcuter:~/.asd/a-new-way-of-stuying-go$ wc -l game7 271화
다음 스크립트는 텍스트 파일을 두 개의 파일로 분할합니다. 하나는 홀수 줄로, 다른 하나는 짝수 줄로 구성한 다음 두 파일을 while IFS 루프로 읽어 각 파일에 한 줄씩 인쇄합니다.
#/bin/bash
#testing liquor-where-twin-twas-born
awk '{print>"line-"NR%2}' $@
while IFS= read -r lineA && IFS= read -r lineB <&3; do
echo "$lineA";
echo "$lineB"
done <line-1 3<line-0
불행하게도 한 파일이 다른 파일보다 한 줄 더 길기 때문에 주어진 내용은 입력 파일과 정확히 동일하지 않습니다.
lara@batcuter:~/.asd/a-new-way-of-stuying-go$testing-liquor game7 > 테스트 lara@batcuter:~/.asd/a-new-way-of-stuying-go$ diff 테스트 게임 7 270a271 >ㄴ 7.
분명히 파일의 길이는 271줄이므로 반으로 나누면 두 개의 파일이 됩니다. 하나는 136줄이고 다른 하나는 135줄입니다. 차이가 0이 되도록 IFS while 루프를 수정해야 합니다. 처음에는 사용하는 것이 read ... || read ...
도움이 될 것이라고 생각했습니다. 그러나 실제로 이것은 다른 모든 솔루션이 시도한 것처럼 출력을 부풀리고 각 항목 사이에 여러 줄 바꿈을 삽입하고 마지막 줄(파일에서 홀수 줄로 끝나는 줄)을 제거합니다.
답변1
말하다추천인||
그는 바보입니다. 를 사용하면 ||
코드 조각이 먼저 모든 줄을 읽은 fileA
다음 모든 줄을 읽게 됩니다. 왜냐하면 true가 반환되는 fileB
한 실행되지 않기 때문입니다. 대신, 두 번 호출하고 반환 상태를 저장한 다음 반환 상태를 테스트하세요.read lineA
read lineB
read
while
IFS= read -r lineA; statusA=$?
IFS= read -r lineB; statusB=$?
[ $statusA -eq 0 ] || [ $statusB -eq 0 ]
do …
파일이 소진되었는지 알아야 하는 경우 $statusA
루프 내부에서 테스트를 계속할 수 있습니다(줄 내용은 비어 있지만 빈 줄과 구별할 수 없습니다).$statusB