1. ホーム
  2. linux

[解決済み] ファイルを分割して、最初の行をそれぞれの断片に残すにはどうしたらいいですか?

2023-05-01 15:18:08

質問

与えられた。 最初の行が「特別な」テキスト-データファイル(例:CSV形式)1つ(例:フィールド名)。

募集中です。 coreutils に相当するもの split -l コマンドと同等ですが、元のファイルからのヘッダ行を結果の各ピースの最初に表示するという追加の要件があります。

私は、何らかの方法で splithead でいいのでしょうか?

どのように解決するのですか?

これは robhruskaの スクリプトを少し整理したものです。

tail -n +2 file.txt | split -l 4 - split_
for file in split_*
do
    head -n 1 file.txt > tmp_file
    cat "$file" >> tmp_file
    mv -f tmp_file "$file"
done

私は wc , cut , lsecho を不要な場所に追加しました。もう少し意味のあるファイル名にするために、いくつかのファイル名を変更しました。読みやすくするために、複数行に分割しただけです。

もっと派手にやりたいなら mktemp あるいは tempfile で、ハードコードされたファイル名を使う代わりに、 一時的なファイル名を作成することができます。

編集

GNUを使う split を使えば可能です。

split_filter () { { head -n 1 file.txt; cat; } > "$FILE"; }; export -f split_filter; tail -n +2 file.txt | split --lines=4 --filter=split_filter - split_

読みやすくするためにブレイクアウトしています。

split_filter () { { head -n 1 file.txt; cat; } > "$FILE"; }
export -f split_filter
tail -n +2 file.txt | split --lines=4 --filter=split_filter - split_

いつ --filter が指定されている場合。 split は各出力ファイルに対してコマンド (この場合は関数。エクスポートする必要があります) を実行し、変数 FILE をファイル名に設定します。

フィルタスクリプトや関数は、出力内容やファイル名に対してどんな操作でも行うことができます。後者の例としては、可変ディレクトリの固定ファイル名への出力が考えられます。 > "$FILE/data.dat" といった具合です。