通过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无法输出文件中不存在的数据。如果文件为空,它甚至没有换行符来提供空行作为输出。

您可以确保文件至少包含一个换行符。

这就是您如何使用 GNUawk来确保(这会修改空文件):

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

ENDFILE块将在完成读取任何文件后执行。如果FNR为零,则我们从未在文件中看到任何行,因此我们在其中插入一个换行符。然后脚本继续处理下一个文件。

然后您可以cat像在问题中那样使用。


或者,在不更改文件的情况下,使用 GNUawk 代替 cat:

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

这对空文件进行与上面相同的检测,但将换行符打印到标准输出而不是文件。1末尾的可以替换为{ print }, 将会导致非空文件中的所有数据被输出。


或者,shell 循环(应该可以在任何 POSIX shell 中工作):

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

-s如果文件存在并且大小大于零,则测试为真。


[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

相关内容