Exibir linhas em branco pelo comando cat

11

Eu tenho uma lista de arquivos.txt, abaixo:

-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  

Saída:

kpgmeddev01> cat 2[0-8]_SumActive.txt   
Sum: 47760  
Sum: 72000  
Sum: 0

Como obter resultados como abaixo:

Sum: 47760  
Sum: 72000  
Sum: 0  
[Blank]  
[Blank]  

Precisa de orientação.

    
por Fewong 16.05.2018 / 06:33

8 respostas

20

cat não pode enviar dados que não existem nos arquivos. Se um arquivo estiver vazio, ele não terá nem mesmo um caractere de nova linha para fornecer uma linha vazia como saída.

Você pode ter certeza de que os arquivos contenham pelo menos um único caractere de nova linha.

É assim que você usa o GNU awk para garantir que (isso modifica os arquivos vazios):

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

O bloco ENDFILE será executado depois de terminar a leitura de qualquer um dos arquivos . Se FNR for zero, nunca vimos nenhuma linha no arquivo, então inserimos uma única nova linha nela. O script continua com o próximo arquivo.

Você pode usar cat como fez na pergunta.

Como alternativa, sem alterar os arquivos, usando o GNU awk em vez de cat :

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

Isso faz o mesmo tipo de detecção de arquivos vazios como acima, mas imprime a nova linha na saída padrão em vez de no arquivo. O 1 no final pode ser substituído por { print } e fará com que todos os dados nos arquivos não vazios sejam exibidos.

Como alternativa, um loop de shell (deve funcionar em qualquer shell POSIX):

for name in ./2[0-8]_SumActive.txt; do
    if [ -s "$name" ]; then
        cat "$name"
    else
        printf '\n'
    fi
done

O teste -s será verdadeiro se o arquivo existir e tiver um tamanho maior que zero.

Se você quiser que a string literal [Blank] seja enviada para arquivos vazios, basta inserir essa sequência na frente de \n nas chamadas para printf acima (isso também funcionará no código awk ).

    
por 16.05.2018 / 07:32
16

com perl

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

Que adiciona um caractere de nova linha se estiver faltando no final, então produziria uma linha vazia para arquivos vazios, mas também adicionaria uma nova linha para arquivos não vazios que faltam (e acabaria sendo concatenada em uma única linha com cat ).

    
por 16.05.2018 / 13:17
13

(Isso não é exatamente o que você pergunta, mas :) Neste tipo de situações eu prefiro usar 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 <==

Normalmente, isso é o que você quer. Se não é fácil sed depois

    
por 16.05.2018 / 11:16
12

Com xargs e grep , você pode tentar algo como:

$>ls | xargs -n1 sh -c 'grep "" $0 || echo "[Blank]"'
Sum: 47760
Sum: 72000
Sum: 0
[Blank]
[Blank]
    
por 16.05.2018 / 10:01
6

Assumindo que [Blank] significa linhas vazias literais, isso deve funcionar:

paste -s 2[0-8]_SumActive.txt
    
por 17.05.2018 / 01:32
6

Você pode testar cada arquivo para ver se é zero antes de tentar exibir seu conteúdo:

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

Eu usei awk 1 "$f" em vez de cat "$f" porque awk garante o encerramento da saída de um arquivo com uma nova linha.

Em sua pergunta, se você quisesse que [blank] não fosse literal, mas apenas uma linha em branco, você pode implementar isso usando o código acima e removendo '[Blank]' do final da instrução echo . / p>     

por 16.05.2018 / 09:08
5

Estou assumindo que seus arquivos 26_SumActive.txt e 28_SumActive.txt estão vazios e você precisa de linhas em branco ao exibir seu conteúdo

Para isso, você pode apenas percorrer a sua lista de arquivos, e catar seu conteúdo, e se o arquivo estiver vazio, ecoar em branco.

[ -s FILE ] Verdadeiro se o FILE existir e tiver um tamanho maior que zero.

$ 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 ]
    
por 16.05.2018 / 07:27
1
cat 2[0-8]_SumActive.txt -

onde - permitirá que o cat leia a partir da entrada padrão.

Então, depois de exibir o conteúdo dos seus arquivos, o gato irá aguardar sua entrada. Você pode fazer a sua entrada desejada, pressionando enter para espaços vazios ou [Blank] se for o que você deseja. Depois que cada entrada for pressionada, depois que todas as entradas forem feitas pressione ^ D (Ctrl + D) e pronto.

P.S: Para cada entrada você obterá a respectiva saída.

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

Com isso você pode colocar espaços em branco ou qualquer outra coisa que você queira, entre duas seqüências de saídas.

    
por 17.05.2018 / 22:37