以下の 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
ファイルに存在しないデータは出力できません。ファイルが空の場合、空行を出力として提供する改行文字もありません。
ファイルに改行文字が 1 つ以上含まれていることを確認できます。
以下はawk
GNUの使用を確認する方法です(空のファイルを修正しました)。
awk 'ENDFILE { if (FNR == 0) printf("\n") >>FILENAME }' 2[0-8]_SumActive.txt
これENDFILE
ブロックは、すべてのファイルの読み取りが完了した後に実行されます。 0 の場合、FNR
ファイル内のどの行も見たことがないので、改行文字を挿入します。その後、スクリプトは次のファイルに移動します。
cat
その後、質問のように使用できます。
あるいは、ファイルを変更せずにGNUを使用してください。awk
変える cat
:
awk 'ENDFILE { if (FNR == 0) printf("\n") } 1' 2[0-8]_SumActive.txt
これは、上記のように空のファイルを検索するのと同じですが、ファイルの代わりに標準出力に改行を印刷します。1
末尾の項目を で置き換えると、{ print }
空でないファイルのすべてのデータが出力されます。
またはシェルループ(すべてのPOSIXシェルで動作する必要があります):
for name in ./2[0-8]_SumActive.txt; do
if [ -s "$name" ]; then
cat "$name"
else
printf '\n'
fi
done
-s
ファイルが存在し、サイズが0より大きい場合、テストはtrueです。
[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