次の列ヘッダーがあります。
EntryDate,HH_ID,HH_type,ID#,Age,First,Last,Gender,Race,Ethnicity,CaseWorkerName
完全に一致する約2000のデータ行があります。
CaseWorkerName
他の列のすべての値をソートしてソートしたいです。
これを達成するための最良の方法は何ですか?
ベストアンサー1
11列ですCaseWorkerName
。sort
ソート基準となる列と列を指定するときに使用する区切り文字をユーティリティに通知できます。
$ sort -t ',' -k11,11 data.in
sort
これは、カンマを区切り文字として使用し、11列から11列(つまり11列のみ)のアルファベット順に昇順で並べ替えることを示します。
出力はコンソールに書き込まれます。出力を別のファイルに保存するには、次のようにします。
$ sort -t ',' -k11,11 -o data.out data.in
data.in
このフラグを使用して-o
出力ファイルを指定できます。
最初の行(列ヘッダーを含めることができます)をソートしたくない場合は、まずデータからヘッダーを分離する必要があります。
$ head -n 1 data.in >data.header
$ sed '1d' data.in >data.unsorted
次に、ソートされたデータをソートし、ヘッダーと再結合します。
$ sort -t ',' -k1,11 -o data.sorted data.unsorted
$ cat data.header data.sorted >data.out
$ rm data.sorted data.header data.unsorted
またはより短く
$ sed '1d' data.in | sort -t ',' -k11,11 -o data.sorted
$ head -n 1 data.in | cat - data.sorted >data.out
$ rm data.sorted
GNU coreutilsを使用するLinuxシステムでは、この時間が短くなる可能性があります。
$ ( head -n 1; sort -t ',' -k11,11 ) <data.in >data.out
GNU coreutils実装では、head
subprocess((...)
)の標準入力が最初に消費され、残りhead
のデータが供給されますsort
。子プロセスの出力はの出力で、head
その後はの出力に従いますsort
。
他のシステムでは、head
標準入力ストリームで予想以上に消費する可能性があります。これはsort
何も提供しません(または少なくともファイルの残りの部分は提供しません)。少なくともOpenBSDでは。
結果はdata.out
上記の各例に従います。
列のデータにカンマが含まれている場合、これらのメソッドはすべて失敗します。