두 개의 파일을 IFS while 루프로 읽는 중 - 이 경우 차이가 없는 결과를 얻을 수 있는 방법이 있습니까?

두 개의 파일을 IFS while 루프로 읽는 중 - 이 경우 차이가 없는 결과를 얻을 수 있는 방법이 있습니까?

다음과 같은 수백 줄의 시퀀스가 ​​포함된 텍스트 파일이 있습니다.

    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 lineAread lineBread

while
    IFS= read -r lineA; statusA=$?
    IFS= read -r lineB; statusB=$?
    [ $statusA -eq 0 ] || [ $statusB -eq 0 ]
do …

파일이 소진되었는지 알아야 하는 경우 $statusA루프 내부에서 테스트를 계속할 수 있습니다(줄 내용은 비어 있지만 빈 줄과 구별할 수 없습니다).$statusB

관련 정보