3

膨大な数 (>10k) のテキスト ファイルにヘッダー (1 行) を追加する必要があります。変数 $HEADER に適切なヘッダーが含まれていると仮定します。コマンド

find -type f -name 'tdgen_2012_??_??_????.csv' | xargs sed -i "1s/^/$HEADER\n/"

うまくいきます。私が直面している問題は、一部のデータ ファイル (tdgen_2012_?? ?? ????.csv) が空であることです。sed(1) は、ファイルの存在しない行に対処できません。空のファイルを別の方法で管理することにしました。

echo $HEADER | tee $(find -type f -name 'tdgen_2012_??_??_????.csv' -empty) > /dev/null

空のファイルが多いため、上記のコマンドは機能しません。tee(1) は無制限の数のファイルに書き込むことはできません。また、コマンド ライン引数の数を超えることもできます。

パフォーマンスが低いため、for-cycle を使用したくありません (tee(1) は一度に多くのファイルを書き込むことができます)。

私の質問:

  1. 一度に両方の種類のデータ ファイル (空/非空) に対する 1 つのソリューションが存在しますか?
  2. そうでない場合: 空のファイルを効果的に管理するには?
4

2 に答える 2

5
echo $HEADER > header
find -type f -name 'tdgen_2012_??_??_????.csv' \
    -exec sh -c '{ echo $HEADER; cat {}; } > tmp && mv tmp {}' \; -print

説明:

1. -exec sh -c "..." - 複数のコマンドを呼び出せるようにする

2. { echo $HEADER; cat {}; } > tmp && mv tmp {} - と見つかったファイルを連結$HEADERし、見つかったファイルにtmp名前tmpを変更します。できないからといってcat header {} > {}

3. -print - 変更されたすべてのファイルのファイル名を表示する

于 2013-05-14T13:53:40.023 に答える
0

分割統治についてはどうですか:

echo "$HEADER" > header
find . -type f -size 0   -name 'tdgen_2012_??_??_????.csv' -exec cp header {} \;
find . -type f -size +0c -name 'tdgen_2012_??_??_????.csv' | sed -i ...
rm header

これは空のファイルに対してのみcp実行し、空でないファイルに対して xargs/sed のパフォーマンスを維持します。単一のコマンドとして使用する場合は、スクリプトでラップするだけです。

既成概念にとらわれずに考えてみましょう:空のファイルを処理する意味は何ですか? 特に、データのないファイルにヘッダーを書き込んでいる場合は? そもそも空のファイルを作成しないようにするか、削除するかのどちらかです。生活をとてもシンプルにします。覚えておいてください:削除されたファイルだけが良いファイルです:-)

于 2013-05-14T14:08:25.947 に答える