cat 명령을 통해 빈 줄 표시

cat 명령을 통해 빈 줄 표시

다음과 같은 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파일에 존재하지 않는 데이터는 출력할 수 없습니다. 파일이 비어 있으면 빈 줄을 출력으로 제공하는 개행 문자도 없습니다.

파일에 개행 문자가 하나 이상 포함되어 있는지 확인할 수 있습니다.

다음은 awkGNU 사용을 확인하는 방법입니다(빈 파일을 수정함).

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

관련 정보