通过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

不,只有1条线
-Fewong

1
嗯,当您撰写文章[Blank]时,您的意思是那7个字符,还是打算指出一个空行?
roaima

1
通过不使用猫。不要约束自己。
ctrl-alt-delor

Answers:


20

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

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

这是使用GNU awk来确保的方式(这将修改空文件):

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

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

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


或者,在不更改文件的情况下,使用GNU awk 代替 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]为空文件输出原义字符串,只需\nprintf上面的调用中将该字符串插入前面(这在awk代码中也可以使用)。


2
@Fewong很好!如果这样可以解决您的问题,请考虑接受答案
库萨兰达

@Fewong:或者接受另一个可以帮助您更好的答案-最好的做法是给每个时区一个机会,所以不要着急。
MSalters

@Fewong绝对不要着急。Stephané也写了一个简短而紧凑的解决方案,看起来很有希望。
库萨兰达

@Kusalananda,谢谢,我测试了它的工作原理。
Fewong

16

perl

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

如果末尾缺少该行,则会添加一个换行符,因此将为空文件输出一个空行,但还会为缺少文件的非空文件添加一个换行符(最终将与串联在一起cat)。


不错的建议
erTugRul

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

使用xargs和,grep您可以尝试类似的方法:

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

4
也许不是最快的解决方案(为每个文件分配一个shell),但是到目前为止,只有当您在当前目录中有数百万个这样的文件时才有效(不使用shell扩展并达到ARGV限制)。
Matija Nalis

1
@MatijaNalis:非常正确!但是您真的不在乎5个文件。
FloHimself


6

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

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存在且大小大于零,则为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;。对于仅使用标准Shell功能的简单测试,仍然+1。
MSalters

2
或者只是cat "$i"; test -s "$i" || echo-不需要那些笨拙if或不可携带的echo标志。
Toby Speight

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

其中 - 将使cat能够从标准输入中读取。

因此,在显示文件内容之后,cat将等待您的输入。您可以输入所需的输入,方法是按Enter键以输入空白文本,如果需要则按[Blank]。每次输入命中回车后,一旦完成所有输入,请按^ D(Ctrl + D)完成。

PS:对于每个输入,您将获得各自的输出。

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

这样,您就可以在两个输出序列之间放置空格或其他所需的内容。


在此基础上,您最好只提供cat解决方案,然后让OP满足您的需求。
roaima
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.