次のような約100万行のファイルがあります。
"ID" "1" "2"
"00000687" 0 1
"00000421" 1 0
"00000421" 1 0
"00000421" 1 0
最後の行は百万回以上繰り返された。 ~からインスピレーションを得るこの問題、提案された解決策のいくつかを試して、どちらが速いかを確認しました。 1つのプロセスしか使用しないソリューションは、パイプがあるソリューションよりも高速であると期待しています。しかし、これは私のテストの結果です。
tail -n +2 file.txt | tr -d \"
$ time tail -n +2 file.txt | tr -d \" 1> /dev/null real 0m0,032s user 0m0,020s sys 0m0,028s
sed '1d;s/"//g' file.txt
$ time sed '1d;s/"//g' file.txt 1> /dev/null real 0m0,410s user 0m0,399s sys 0m0,011s
perl -ne ' { s/"//g; print if $. > 1 }' file.txt
$ time perl -ne ' { s/"//g; print if $. > 1 }' file.txt 1> /dev/null real 0m0,379s user 0m0,367s sys 0m0,013s
何度もテストを繰り返しましたが、いつも同様の数値が出ました。ご覧のとおり、tail -n +2 file.txt | tr -d \"
はいはるかに早く他人より。なぜ?
ベストアンサー1
これは、実行されるタスクの量によって決まります。
あなたのtail | tr
コマンドは次のように終了します。
- 存在する
tail
:- 改行まで読みます。
- 改行の有無にかかわらず、残りの内容をすべて出力します。
- in は
tr
読み、改行文字を気にせず、 '''(固定文字)を除くすべてを出力します。
sed
与えられたスクリプトを解釈した後、コマンドは次のことを行います。
- 改行まで読み、入力を累積します。
- 最初の行の場合は削除してください。
- 正規表現を解釈した後、すべての二重引用符を空白スペースに置き換えます。
- 処理されたラインを出力します。
- ファイルの最後まで繰り返します。
与えられたスクリプトを解釈した後、Perlコマンドは次のことを行います。
- 改行まで読み、入力を累積します。
- 正規表現を解釈した後、すべての二重引用符を空白スペースに置き換えます。
- 最初の行でない場合は、処理された行を出力します。
- ファイルの最後まで繰り返します。
大量の入力のため、改行文字を見つけるのに費用がかかります。