2016-12-05 18 views
1

私は、次のような単一の呼び出しでシェルスクリプト内のファイルを50+解析しよう過去のファイルの長さ制限を取得するにはどうすればよいですか?

 
for i in {0..49} 
do 
    _file_list="$_file_list $_srcdir01/${_date_a[$i]}.gz" 
done 
eval zcat "$_file_list" | awk '{sum += 1} END {print sum;}' 

しかし、私はこれを行うとき、私はzcatをして「ファイル名が長すぎます」というエラーが表示されます。い

私がこれを1回の呼び出しで行う理由は、私の知る限り、awkは以前の呼び出しからの情報を保持できないからです。そして、全体を考慮してリスト全体を調べる必要があります(たとえば、そのリスト内でユニークな単語を見つけるなど)。

それぞれが大容量のファイルであるため、ファイルを結合したくありません。

これを解決するための巧妙な方法はありますか?コールを分割して途中結果を書き出す必要がありますか?

答えて

4

あなたがループから直接パイプすることができます:いずれの場合で

for date in "${_date_a[@]}" 
do 
    zcat "$_srcdir01/$date.gz" 
done | awk '{sum += 1} END {print sum;}' 

を掲示として、そのコードはそのエラーを与えるべきではありません。

あなたの例では、完全または自己完結型ではないので、私はテストにデータファイルを初期化するためにいくつかのコードを追加:

$ cat testscript 
_srcdir01="./././././././././././././././././././" 
_date_a=(foo{0001..0050}) 
for file in "${_date_a[@]}" 
do 
    echo "hello world" | gzip > "$file.gz" 
done 

for i in {0..49} 
do 
    _file_list="$_file_list $_srcdir01/${_date_a[$i]}.gz" 
done 
eval zcat "$_file_list" | awk '{sum += 1} END {print sum;}' 

は、テストデータの束を生成し、正しく行数を合計実行:

$ bash testscript 
50 

私はあなたの問題を再現できます。 evalを削除します。

$ bash testscript 
(...)/foo0045.gz ./././././././././././././././././././/foo0046.gz ././././././. 
/././././././././././././/foo0047.gz ./././././././././././././././././././/foo0 
048.gz ./././././././././././././././././././/foo0049.gz ./././././././././././. 
/./././././././/foo0050.gz: file name too long 

ですから、POSTコードは、実行コードではなく、それを解決しようとしているときに、あなたが作った他のいくつかの試みの一つであることを再確認してください。

+0

'eval'を削除した場合、それは倍数ではなく単一の*ファイル名としてすべてのものを渡します。 – o11c

+0

'awk '{sum + = 1} END {print sum;}''を 'awk 'END {print NR}''に置き換えることができます。 –

+0

謝罪します。私は働いていた解決策を持っていました..しかし、ループソリューションのzcatが好きなのは、そのクリーナーだからです。私は最終的な結果の違いは見当たりませんでしたが、 '$ list_of_files"のファイルのための背景動作の違いは do zcatファイル done'と 'zcat long_long_list_of files'ですか? – dorachan2010

-1
$ awk '{sum += 1} END {print sum}' files... 

は動作しますが、おそらくあなただけ手動でファイルリストを構築する必要がないので、

$ zcat path/to/files{1..49} | awk ... 

も同様に動作しますwc -l

を使用する必要があります。

+0

これは明らかに最小限の例です。そして 'awk'は圧縮されたファイルに対して直接動作することはできません。 – o11c

関連する問題