GNU/Linux >> Linux の 問題 >  >> Linux

ファイルを分割し、各部分の最初の行を保持する方法は?

このワンライナーは、大きな csv を 999 レコードの断片に分割し、各レコードの上部にあるヘッダー行を保持します (999 レコード + 1 ヘッダー =1000 行)

cat bigFile.csv | parallel --header : --pipe -N999 'cat >file_{#}.csv'

Ole Tange の回答に基づいています。

並列インストールに関するヒントについては、コメントを参照してください


これはロブルスカのです スクリプトを少しクリーンアップ:

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 を削除しました 、 cutlsecho 不要な場所に。ファイル名の一部を変更して、もう少し意味のあるものにしました。読みやすくするために複数行に分割しました。

派手にしたい場合は、 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" 例えば。


GNU coreutils split>=8.13 (2011) で新しい --filter 機能を使用できます:

tail -n +2 FILE.in | split -l 50 - --filter='sh -c "{ head -n1 FILE.in; cat; } > $FILE"'

Linux
  1. コマンドラインからアクセス許可と所有者を変更する方法

  2. Linuxでコマンドラインからファイルを分割して結合する方法

  3. Vimの各行の先頭にテキストを挿入する方法

  1. ファイルの最初の行の前にテキストを挿入する方法は?

  2. Imgファイルのタイプを見つけてマウントする方法は?

  3. 一致する各行の上下の行をgrepで印刷するにはどうすればよいですか?

  1. コマンドラインを使用してLinuxでtar.gzファイルを抽出する方法

  2. ファイルの行をループする方法は?

  3. スクリプトの同じ行で stderr と stdout を別のファイルにリダイレクトする方法は?