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]
为空文件输出文字字符串,只需\n
在printf
上面的调用中插入该字符串(这也适用于awk
代码)。
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
有了xargs
和grep
你可以尝试这样的:
$>ls | xargs -n1 sh -c 'grep "" $0 || echo "[Blank]"'
Sum: 47760
Sum: 72000
Sum: 0
[Blank]
[Blank]
Run Code Online (Sandbox Code Playgroud)
您可以在尝试显示其内容之前测试每个文件以查看其长度是否为零:
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
语句的末尾删除来实现它。
小智 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)
归档时间: |
|
查看次数: |
3277 次 |
最近记录: |