다음과 같은 files.txt 목록이 있습니다.
-rw-rw-r-- 1 root dev 11 May 16 12:18 20_SumActive.txt
-rw-rw-r-- 1 root dev 11 May 16 12:18 22_SumActive.txt
-rw-rw-r-- 1 root dev 7 May 16 12:18 24_SumActive.txt
-rw-rw-r-- 1 root dev 0 May 16 12:18 26_SumActive.txt
-rw-rw-r-- 1 root dev 0 May 16 12:18 28_SumActive.txt
산출:
kpgmeddev01> cat 2[0-8]_SumActive.txt
Sum: 47760
Sum: 72000
Sum: 0
출력을 얻는 방법은 다음과 같습니다.
Sum: 47760
Sum: 72000
Sum: 0
[Blank]
[Blank]
지도가 필요합니다.
답변1
cat
파일에 존재하지 않는 데이터는 출력할 수 없습니다. 파일이 비어 있으면 빈 줄을 출력으로 제공하는 개행 문자도 없습니다.
파일에 개행 문자가 하나 이상 포함되어 있는지 확인할 수 있습니다.
다음은 awk
GNU 사용을 확인하는 방법입니다(빈 파일을 수정함).
awk 'ENDFILE { if (FNR == 0) printf("\n") >>FILENAME }' 2[0-8]_SumActive.txt
이것ENDFILE
블록은 모든 파일 읽기를 마친 후에 실행됩니다. 0 이면 FNR
파일에서 어떤 줄도 본 적이 없으므로 줄 바꿈 문자를 삽입합니다. 그런 다음 스크립트는 다음 파일로 이동합니다.
cat
그런 다음 질문과 같이 사용할 수 있습니다 .
또는 파일을 변경하지 않고 GNU를 사용하십시오.awk
바꾸다 cat
:
awk 'ENDFILE { if (FNR == 0) printf("\n") } 1' 2[0-8]_SumActive.txt
이는 위와 같이 빈 파일을 검색하는 것과 동일하지만 파일 대신 표준 출력에 개행을 인쇄합니다. 1
후행 항목을 로 대체하면 { print }
비어 있지 않은 파일의 모든 데이터가 출력됩니다.
또는 쉘 루프(모든 POSIX 쉘에서 작동해야 함):
for name in ./2[0-8]_SumActive.txt; do
if [ -s "$name" ]; then
cat "$name"
else
printf '\n'
fi
done
-s
파일이 존재하고 크기가 0보다 크면 테스트는 true입니다.
[Blank]
빈 파일에 대해 리터럴 문자열을 출력하려면 위 \n
호출 앞에 해당 문자열을 삽입하기만 하면 됩니다 printf
(코드에서도 작동함 awk
).
답변2
그리고perl
perl -0777 -pe 's/\n?\z/\n/' 2[0-8]_SumActive.txt
끝에 줄 바꿈이 없으면 줄 바꿈이 추가되므로 빈 파일에 대해 빈 줄이 출력되지만 줄 바꿈이 없는 비어 있지 않은 파일에도 줄 바꿈이 추가됩니다(그리고 결국 연결됨). 한 줄 cat
).
답변3
(정확히 요청하신 내용은 아니지만 :) 이 경우에는 다음을 사용하는 것을 선호합니다.head
$ head -z 2[0-8]_SumActive.txt
==> 21_SumActive.txt <==
Sum: 47760
Sum: 72000
Sum: 0
==> 22_SumActive.txt <==
==> 25_SumActive.txt <==
==> 28_SumActive.txt <==
일반적으로 이것이 당신이 원하는 것입니다. 그렇지 않으면 sed
나중에 편해질 것이다
답변4
리터럴 빈 줄을 의미한다고 가정하면 [Blank]
다음과 같이 작동합니다.
paste -s 2[0-8]_SumActive.txt