複数の.csvログファイルを消去しますが、ヘッダーを保持してください。

複数の.csvログファイルを消去しますが、ヘッダーを保持してください。

最上位ディレクトリの2つのサブディレクトリにいくつかの.csvログファイルがあり、各ディレクトリ内のすべての.csvログファイルを空にしますが、ヘッダーを維持してそのファイルを作成したアプリケーションがファイルを再入力できるようにします。

これを使用してファイルを空にすることができますが、for file in /path/to/file/*; do > $file;doneヘッダも削除されます!

答え1

tmpfile=$( mktemp )

for pathname in /path/to/dir/*.csv; do
    head -n 1 "$pathname" >"$tmpfile"
    cat "$tmpfile >"$pathname"
done

rm "$tmpfile"

つまり、head -n 1一時ファイルを使用してヘッダーを抽出し(最初の行であると仮定)、元のファイルを切り取り、一時ファイルからヘッダーを挿入します。

ヘッダーがすべてのファイルでまったく同じ場合:

tmpfile=$( mktemp )
set -- /path/to/dir/*.csv

head -n 1 "$1" >"$tmpfile"

for pathname do
    cat "$tmpfile" >"$pathname"
done

rm "$tmpfile"

まず、位置パラメータを目的のファイルのリストに設定し、最初のファイルからヘッダーを抽出します。このループは位置パラメータ(CSVファイル)を繰り返し、各パラメータを切り取り、タイトルを挿入します。

上記の2つの例では、パターンが一致すると仮定/path/to/dir/*.csvします。みんな影響を受けるファイル。実際のパターンの実際の例は次のとおりです。

/var/log/myprogram/dir1/*.csv /var/log/myprogram/dir2/*.csv

または中かっこ拡張をサポートするシェルを使用している場合:

/var/log/myprogram/{dir1,dir2}/*.csv

答え2

または、オプションをsed提供したい場合に置き換えることもできます。ここで保持したいヘッダー行の数は次のとおりです。一部の実装では、明示的に空のバックアップファイルが必要になる場合があります。--in-place-i> "$file"sed -i 4q "$file"4-i ''

ファイル数が大きすぎない場合は、ループを避けてファイルのリストを直接渡すことができます。

sed -si 4q subdir1/*.csv subdir2/*.csv

(暗示されているsように、少なくともGNU sedでは重複する可能性があります)-i-s

または使用find

find path/to/dir -name '*.csv' -execdir sed -si 4q {} +

関連ビューデータ自体を一覧表示せずにデータからヘッダー名のみを抽出する方法

関連情報