cat 명령으로 빈 줄 표시


11

아래에 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]  

지도가 필요합니다.


파일에 한 줄 이상이 포함되어 있습니까?
roaima

아니요, 한 줄만
Fewong

1
글을 썼을 때 [Blank]그 7자를 의미 했습니까 , 아니면 빈 줄을 나타내려고하십니까?
roaima

1
고양이를 사용하지 않음. 자제하지 마십시오.
ctrl-alt-delor

답변:


20

cat파일에 존재하지 않는 데이터를 출력 할 수 없습니다. 파일이 비어 있으면 출력으로 빈 줄을 제공하는 줄 바꿈 문자가 없습니다.

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

이것은 GNU awk를 사용 하여 다음을 확인하는 방법 입니다 (빈 파일 수정).

awk 'ENDFILE { if (FNR == 0) printf("\n") >>FILENAME }' 2[0-8]_SumActive.txt   

ENDFILE블록은 파일의 읽기가 끝난 후 실행됩니다. 경우 FNR제로 우리가 그것으로 하나의 줄 바꿈을 삽입 할 수 있도록, 우리는 파일의 모든 라인을 본적이 없어요. 그런 다음 스크립트는 다음 파일을 계속 진행합니다.

그런 다음 cat질문에서했던 것처럼 사용할 수 있습니다 .


또는 파일을 변경하지 않고 다음 awk 대신 GNU를 사용하십시오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
@Fewong Good! 그래도 문제가 해결 되면 답변 수락을 고려하십시오 .
Kusalananda

@Fewong : 또는 더 나은 답변을 얻을 수있는 다른 대답을 받아들이십시오. 모든 시간대에 기회를주는 것이 좋은 방법이므로 서두르지 마십시오.
MSalters

@Fewong 서둘러 요. Stephané는 짧고 간결한 솔루션도 작성했으며 유망한 것으로 보입니다.
Kusalananda

@ Kusalananda, 고마워하고 나는 그것을 시험했다.
Fewong

16

perl

perl -0777 -pe 's/\n?\z/\n/' 2[0-8]_SumActive.txt

끝에 줄 바꿈이 있으면 줄 바꿈 문자가 추가되므로 빈 파일의 경우 빈 줄이 출력되지만 비어 있지 않은 파일의 경우 줄 바꿈이 추가 cat됩니다.


좋은 제안
erTugRul 11

13

(이것은 정확히 당신이 요구하는 것이 아니지만 :) 이런 상황에서 나는 사용하는 것을 선호합니다. 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나중에 쉽게 할 수 있습니다


12

xargsgrep당신이 뭔가를 같이 시도해 볼 수도 있습니다 :

$>ls | xargs -n1 sh -c 'grep "" $0 || echo "[Blank]"'
Sum: 47760
Sum: 72000
Sum: 0
[Blank]
[Blank]

4
아마도 가장 빠른 해결책은 아니지만 (각 파일마다 쉘을 포크) 현재 디렉토리에 수백만 개의 파일이있는 경우 실제로 작동하는 쉘만 있습니다 (쉘 확장을 사용하지 않고 ARGV 제한에 도달).
Matija Nalis

1
@MatijaNalis : 매우 사실입니다! 그러나 실제로 5 개의 파일을 신경 쓰지 않을 것입니다.
FloHimself

6

[Blank]문자 그대로 빈 줄을 의미 한다고 가정하면 다음과 같이 작동합니다.

paste -s 2[0-8]_SumActive.txt

6

내용을 표시하기 전에 각 파일의 길이가 0인지 테스트 할 수 있습니다.

for f in 2[0-8]_SumActive.txt;
do
    [[ -s "$f" ]] && awk 1 "$f" || echo '[Blank]'
done

내가 사용했던 awk 1 "$f"대신 cat "$f"때문에 awk보장 개행을 가진 파일의 출력을 종료합니다.

귀하의 질문에, 그것이 [blank]리터럴이 아니라 빈 줄이되 도록 의도 한 경우 위의 코드를 사용 '[Blank]'하여 echo명령문 의 끝에서 제거하여이를 구현할 수 있습니다 .


5

26_SumActive.txt 및 28_SumActive.txt 파일이 비어 있다고 가정하고 내용을 표시 할 때 빈 줄이 필요합니다

이를 위해 파일 목록을 반복하고 내용을 정리하고 파일이 비어 있으면 빈 줄을 에코하십시오.

[ -s FILE ] FILE이 존재하고 크기가 0보다 큰 경우 True입니다.

$ for i in $(ls 2[0-8]_SumActive.txt) ; do  cat $i;  if [ ! -s $i ]; then echo -e ""; fi; done
Sum: 47760  
Sum: 72000  
Sum: 0  
[ Blank Line]
[ Blank Line ]

1
또는 if [ -s $i ]; then cat $i; else echo -e ""; fi;. 표준 쉘 기능 만 사용하여 간단한 테스트를하려면 여전히 +1입니다.
MSalters

2
또는 cat "$i"; test -s "$i" || echo다루기 힘들 if거나 이식 할 수없는 echo플래그 가 필요하지 않습니다 .
Toby Speight

1
cat 2[0-8]_SumActive.txt -

여기서 - 표준 입력에서 cat을 읽을 수 있습니다.

따라서 파일의 내용을 표시 한 후 cat은 입력을 기다립니다. 리터럴 공백으로 Enter 키를 누르거나 원하는 경우 [공백]을 눌러 원하는 입력을 할 수 있습니다. 각 입력 히트 엔터가 입력되면 모든 입력이 완료되면 ^ D (Ctrl + D)를 누르면 완료됩니다.

추신 : 각 입력에 대해 각각의 출력을 얻습니다.

cat 2[0-8]_SumActive.txt - 4[0-8]_SumActive.txt

이를 통해 두 출력 시퀀스 사이에 공백이나 원하는 것을 넣을 수 있습니다.


이를 바탕으로 cat솔루션을 제공 하고 원하는대로 OP를 허용 할 수 있습니다.
roaima
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.