通过 cat 命令显示空行

Few*_*ong 11 command-line solaris

我有一个 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  
Run Code Online (Sandbox Code Playgroud)

输出:

kpgmeddev01> cat 2[0-8]_SumActive.txt   
Sum: 47760  
Sum: 72000  
Sum: 0
Run Code Online (Sandbox Code Playgroud)

如何获得输出如下:

Sum: 47760  
Sum: 72000  
Sum: 0  
[Blank]  
[Blank]  
Run Code Online (Sandbox Code Playgroud)

需要指导。

Kus*_*nda 20

cat无法输出文件中不存在的数据。如果文件为空,它甚至没有换行符来提供空行作为输出。

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

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

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

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

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


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

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

这与上面的空文件检测相同,但将换行符打印到标准输出而不是文件。将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
Run Code Online (Sandbox Code Playgroud)

-s文件是否存在且大小大于零的考验将是真实的。


如果您希望[Blank]为空文件输出文字字符串,只需\nprintf上面的调用中插入该字符串(这也适用于awk代码)。

  • @Fewong 好!如果这解决了您的问题,请考虑[接受答案](https://unix.stackexchange.com/help/someone-answers)。 (2认同)

Sté*_*las 16

perl

perl -0777 -pe 's/\n?\z/\n/' 2[0-8]_SumActive.txt
Run Code Online (Sandbox Code Playgroud)

如果最后缺少换行符,它会添加一个换行符,因此将为空文件输出一个空行,但也会为丢失的非空文件添加一个换行符(最终会与 连接在一行上cat)。


JJo*_*oao 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 <==
Run Code Online (Sandbox Code Playgroud)

通常这就是你想要的。如果不是很容易sed稍后


Flo*_*elf 12

有了xargsgrep你可以尝试这样的:

$>ls | xargs -n1 sh -c 'grep "" $0 || echo "[Blank]"'
Sum: 47760
Sum: 72000
Sum: 0
[Blank]
[Blank]
Run Code Online (Sandbox Code Playgroud)

  • 也许不是最快的解决方案(为每个文件分叉一个 shell),但如果当前目录中有数百万个这样的文件(不使用 shell 扩展并达到 ARGV 限制),那么到目前为止只有一个真正有效的解决方案。 (4认同)

roa*_*ima 6

您可以在尝试显示其内容之前测试每个文件以查看其长度是否为零:

for f in 2[0-8]_SumActive.txt;
do
    [[ -s "$f" ]] && awk 1 "$f" || echo '[Blank]'
done
Run Code Online (Sandbox Code Playgroud)

我使用了awk 1 "$f"而不是cat "$f"因为awk保证以换行符结束文件的输出。

在您的问题中,如果您打算这[blank]不应该是文字,而只是一个空行,您可以使用上面的代码并'[Blank]'echo语句的末尾删除来实现它。


Mat*_*lis 6

假设[Blank]你的意思是文字空白行,这应该有效:

paste -s 2[0-8]_SumActive.txt
Run Code Online (Sandbox Code Playgroud)


小智 5

我假设你的文件 26_SumActive.txt 和 28_SumActive.txt 是空的,显示它们的内容时你需要空行

为此,您可以遍历文件列表,并对其内容进行分类,如果文件为空,则回显空白行。

[ -s FILE ] 如果 FILE 存在且大小大于零,则为 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 ]
Run Code Online (Sandbox Code Playgroud)

  • 或者只是`cat "$i"; 测试 -s "$i" || echo` - 不需要笨重的 `if` 或不可移植的 `echo` 标志。 (2认同)