質問

かなり大きなファイル (10 文字で 1 億 5,000 万行) があります。これを 200 万行の 150 個のファイルに分割する必要があります。各出力行はソース行の最初の 5 文字または最後の 5 文字になります。Perl を使用するとこれをかなり早く実行できますが、bash を使用する簡単な解決策があるかどうか疑問に思っていました。何か案は?

役に立ちましたか?

解決

宿題?:-)

sed (各行を 2 つに分割する) と Split (複数のファイルに分割する) を使用した単純なパイプで十分だと思います。

男の命令はあなたの友達です。


宿題ではないことを確認して追加しました。

どうでしょうか

sed 's/\(.....\)\(.....\)/\1\n\2/' input_file | split -l 2000000 - out-prefix-

?

他のヒント

次のようなものが機能すると思います:

out_file=1
out_pairs=0
cat $in_file | while read line; do
    if [ $out_pairs -gt 1000000 ]; then
        out_file=$(($out_file + 1))
        out_pairs=0
    fi
    echo "${line%?????}" >> out${out_file}
    echo "${line#?????}" >> out${out_file}
    out_pairs=$(($out_pairs + 1))
done

ただし、Perl を使用するよりも簡単か効率的かはわかりません。

各行のバリアントの最初の 5 文字は、大きなファイルが x.txt という名前であると仮定し、現在のディレクトリに x.txt.* という名前のファイルを作成しても問題ないと仮定します。

Split -l 2000000 x.txt x.txt.out && (x.txt.out* の分割ファイルの場合)outfile="${splitfile}.firstfive"; を実行します。echo "$splitfile -> $outfile";カット -c 1-5 "$splitfile" > "$outfile";終わり)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top