Linux/bash でのファイルとその行の分割
-
09-06-2019 - |
質問
かなり大きなファイル (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";終わり)
所属していません StackOverflow