
저는 두 개의 파일 F1과 F2를 인수로 갖고 이를 교대로 인쇄하는 스크립트를 작성하고 싶습니다. 먼저 F1의 첫 번째 줄이 기록되고 그 다음 F2'2의 두 번째 줄 등이 기록됩니다. 그 중 하나가 다른 것보다 줄이 적다면 더 짧은 것을 인쇄할 때 스크립트는 끝까지 가장 길게 작성해야 합니다.
내 생각은 다음과 같습니다.
1) 2개의 인수가 없는지 확인 -> 에코하고 종료 2) F1 또는 F2가 파일이 아닌지 확인 -> 에코하고 종료 3) 본문:
exec 3 < $1
exec 4 < $2
i=0
j=1
while read -u 3 line && ((i==0))
do
echo line; echo
((i++))
((j--))
while read -u 4 line && ((j==0))
do
echo line; echo
((j++))
((i--))
done
done
exit $?
의심: 두 파일의 줄 수가 동일한 경우에만 작동합니다. 이 솔루션을 다른 크기의 파일로 확장하려면 어떻게 해야 합니까?
답변1
쉘 스크립트가 필요하지 않습니다. 를 사용하여 이 작업을 직접 수행할 수 있습니다 paste
.POSIX에 의해 지정됨:
paste -d '\n' file1 file2
그러나 설명하는 방식으로 다른 줄 수를 처리하지 않습니다. 사양을 인용하려면:
하나 이상의 입력 파일에서 파일 끝 조건이 감지되었지만 모든 입력 파일이 아닌 경우,반죽파일 끝이 감지된 파일에서 빈 줄을 읽은 것처럼 동작합니다....
나는 개인적으로 귀하의 질문에 설명된 대로 행동을 취하는 것이 실수라고 생각합니다. 출력의 24번째 줄을 보면 그것이 file1
또는 에서 왔는지 알 수 없습니다 file2
. 의 실제 동작을 통해 출력의 짝수 행 번호이므로 paste
에서 온 것임을 알 수 있습니다 .file2
다음과 같이 출력을 파이프할 수 있습니다 tr -s '\n'
.
paste -d '\n' file1 file2 | tr -s '\n'
하지만 만약 있다면실제두 파일 중 하나에 빈 줄이 있으면 예상한 결과를 얻을 수 없습니다.