5

一般的な形式のcsvファイルがあります

date,  
2013.04.04,
2013.04.04,
2012.04.02,
2013.02.01,
2013.04.05,
2013.04.02,

私が実行するスクリプトは、必ずしも日付順ではないデータをこのファイルに追加します。ファイルを日付順に並べ替え (ヘッダーを無視)、STDOUT に書き込むのではなく、既存のファイルを上書きするにはどうすればよいですか?

awkを使用しました

awk 'NR == 1; NR > 1 {print $0 | "sort -n"}' file > file_sorted
mv file_sorted file

追加のファイルを作成して移動せずにこれを行うより効果的な方法はありますか?

4

2 に答える 2

2

スクリプトと並べ替えが同時に実行されている場合、競合状態が存在することに注意してください。

ファイル ヘッダーがデータの前にソートされる場合は、fedorquiによって提案されたsort -o file file安全な解決策を使用できます (少なくとも GNU ソートでは、 を参照してくださいinfo sort)。

sort内部から実行するawkのはやや複雑に思えますが、別の方法としてheadandを使用することもできますtail(bash シェルを想定):

{ head -n1 file; tail -n+2 file | sort -n; } > file_sorted

さて、既存ファイルの差し替えについて。私の知る限り、質問で説明したように、新しいファイルを作成し、古いファイルを新しいファイルに置き換えるか、次のように使用するという2つのオプションがありspongeますmoreutils

{ head -n1 file; tail -n+2 file | sort -n; } | sponge file

spongeそれでも一時ファイルが作成されることに注意してください。

于 2013-04-18T12:20:33.217 に答える