web-dev-qa-db-ja.com

大きなテキストファイルを100行ごとに分割し、元のヘッダーを含める(Macの場合)

5行目(最初の4行はヘッダー行)から数えて100行ごとに大きなテキストファイルを分割し、元のヘッダーを含む個々の.txtファイルを出力できるツールまたはスクリプト(TextwranglerまたはTerminal)を探しています。

例えば

入力:

File.txt
line1 / line4   HEADER
...
line5 / line265 DATA

出力:

File_01.txt
line1/line4   HEADER
line5/line104 DATA

File_02.txt
line1/line4   HEADER
line5/line104 DATA

File_03.txt
line1/line4   HEADER
line5/line65  DATA

テキストファイルは、重要な場合に備えてWindowsの改行(CR LF)を使用します。

私は現在これを手動で行っているので、このプロセスをより効率的にすることができる提案は大歓迎です。

1
Dan
  1. ヘッダーを削除して、別のファイルheader.txtに入れます。
  2. splitsplit --lines=100 data.txtを使用したデータ(これにより、それぞれxaa xab xacなどの名前が付けられた100行のファイルが多数生成されます)
  3. 次に、各ファイルの先頭にヘッダーを追加しますfor a in x??; do cat header.txt $a > $a.txt; doneこれにより、完成したデータファイル(ヘッダー付き)はxaa.txt xab.txt xac.txt ...と呼ばれます。

データ量が多すぎる場合(または分割する行数が少ない場合)、xxxファイルを十分に分割できない場合は、4文字の名前付きファイルが作成されます。その場合、上記のforステートメントに追加の?を挿入します。

編集:
ヘッダーの抽出を自動化するには、head -4 origdata.txt > header.txtを使用して最初の4行を抽出します。 tail -n +4 origdata.txt > data.txtを使用して、最初の4行を除くすべてを抽出します。これで、ヘッダー付きのファイルとデータ付きのファイルが2つあります。これをスクリプトに組み合わせるのはそれほど難しいことではありません。 (今日はbashにアクセスできません)

5
Nifle

Nifleから提供された回答に基づいて、提案されたコマンドを実行し、元のファイル名を出力に追加し、一時ファイルをクリーンアップするスクリプトを作成しました。

#!/bin/bash

FILE=$(ls -1 | grep filename.txt)
NAME=${FILE%%.txt}

head -4 $FILE > header.txt
tail -n +5 $FILE > data.txt

split -l 100 data.txt

for a in x??
    do
        cat header.txt $a > $NAME.$a.txt
    done

mv $FILE $NAME.orig.txt
rm header.txt data.txt x??

出来上がり!

3
Dan