私は数百万行のテキストファイルを200 MBタブで区切りました。このファイルでは、私は今、私はこのコラムに基づいて、このファイルを壊したくAUなどシェルスクリプトでのパフォーマンスの問題
米国、英国、などの複数の場所でカラムを持っています。このコードはうまくいきますが、場所に基づいてファイルを複数のファイルに分割するのに1時間以上かかるため、パフォーマンス上の問題に直面しています。
#!/bin/bash
read -p "Please enter the file to split " file
read -p "Enter the Col No. to split " col_no
#set -x
header=`head -1 $file`
cnt=1
while IFS= read -r line
do
if [ $((cnt++)) -eq 1 ]
then
echo "$line" >> /dev/null
else
loc=`echo "$line" | cut -f "$col_no"`
f_name=`echo "file_"$loc".txt"`
if [ -f "$f_name" ]
then
echo "$line" >> "$f_name";
else
touch "$f_name";
echo "file $f_name created.."
echo "$line" >> "$f_name";
sed -i '1i '"$header"'' "$f_name"
fi
fi
done < $file
ここに適用されるロジックは、我々が作成し、それにデータを追加している私たちは一度だけ、ファイル全体を読んで、場所に応じているということである:ここではコードです。
コードのパフォーマンスを向上させるために必要な改善を提案してください。
次のサンプルデータは、タブの代わりにコロンで区切られています。国コードは、4列目にされています
ID1:ID2:ID3:ID4:ID5
100:abcd:TEST1:ZA:CCD
200:abcd:TEST2:US:CCD
300:abcd:TEST3:AR:CCD
400:abcd:TEST4:BE:CCD
500:abcd:TEST5:CA:CCD
600:abcd:TEST6:DK:CCD
312:abcd:TEST65:ZA:CCD
1300:abcd:TEST4153:CA:CCD
'while read 'を使用してファイルを読み込んでサブプロセスを実行することはどちらも遅いです。これは、awkなどのテキスト処理ツールの仕事です。 1つのawkスクリプトですべてのことを行うことができます。これははるかに効率的です。いくつかのサンプル入力/出力を持つ簡単な例を示す必要があります。 –
なぜ何かをどこにも印刷しない( '/ dev/null'))? – Jdamian
'f_name = \'エコー "ファイル_" $ loc ".txt" \ ''はあまりにも難しく無用です: 'f_name =" file_ $ loc.txt "を使用してください – Jdamian