방법 1 : 아는 것을 사용하십시오
하나의 파일을 반복하는 방법을 이미 알고 있으므로 파일을 결합한 다음 결합 된 파일을 처리 할 수 있습니다. 이 명령은 paste
두 파일을 한 줄씩 결합합니다. 두 파일에서 오는 줄 사이에 탭을 넣으 므로이 솔루션에서는 파일 이름에 탭이 없다고 가정합니다. 구분 기호를 변경할 수 있지만 파일 이름에없는 문자를 찾아야합니다.
paste -- "$list1.txt" "list2.txt" |
while IFS=$'\t' read -r file1 file2 rest; do
diff -q -- "$file1" "$file2"
case $? in
0) status='same';;
1) status='different';;
*) status='ERROR';;
esac
echo "$status $file1 $file2"
done
빈 줄을 건너 뛰려면 paste
한 파일의 빈 줄과 다른 파일의 빈 줄이 일치 할 수 있으므로 각 파일에서 개별적으로 수행해야 합니다. grep
공백이 아닌 행을 필터링하는 데 사용할 수 있습니다 .
paste -- <(grep '[^[:space:]]' "$list1.txt") <(grep '[^[:space:]]' "list2.txt") |
while IFS=$'\t' read -r file1 file2 rest; do
…
두 파일의 길이가 서로 다르면 $file2
어떤 목록이 먼저 끝나 든 관계없이 비어 있게됩니다.
방법 2 : 두 파일을 반복
while 루프 조건에서 원하는만큼 복잡한 명령을 넣을 수 있습니다. 넣으면 read file1 <&3 && read file2 <&4
두 파일 모두 읽을 줄이있는 한, 즉 한 파일이 없어 질 때까지 루프가 실행됩니다.
while read -u 3 -r file1 && read -u 4 -r file2; do
…
done 3<list1..txt 4<list2.txt
빈 줄을 건너 뛰려면 두 파일을 독립적으로 건너 뛰어야하기 때문에 조금 더 복잡합니다. 쉬운 방법은 문제를 두 부분으로 나누는 것입니다. 한 파일에서 빈 줄을 건너 뛰고 빈 줄이 아닌 줄을 처리합니다. 빈 줄을 건너 뛰는 한 가지 방법 grep
은 위와 같이 처리하는 것입니다. <
리디렉션 연산자와 <(
명령 의심을 시작하는 사이에 필요한 공간을 확인하십시오 .
while read -u 3 -r file1 && read -u 4 -r file2; do
…
done 3< <(grep '[^[:space:]]' "$list1.txt") 4< <(grep '[^[:space:]]' "list2.txt")
또 다른 방법은 read
빈 줄을 건너 뛰고 동작하는 함수를 작성하는 것입니다 . 이 함수는 read
루프 를 호출 하여 작동 할 수 있습니다 . 함수일 필요는 없지만 코드를 구성하고 코드를 두 번 호출해야하기 때문에 함수가 최선의 방법입니다. 함수에서 이름이 값인 변수의 값으로 평가 ${!#}
되는 bash 구문의 인스턴스 ${!VARIABLE}
입니다 VARIABLE
. 여기서 변수는 #
위치 매개 변수의 수를 포함 하는 특수 변수 이므로 ${!#}
마지막 위치 매개 변수입니다.
function read_nonblank {
while read "$@" &&
[[ ${!#} !~ [^[:space:]] ]]
do :; done
}
while read_nonblank -u 3 -r file1 && read_nonblank -u 4 -r file2; do
…
done 3<list1..txt 4<list2.txt
diff
.