我有一个 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