grepとソートオプション

grepとソートオプション

次の列ヘッダーがあります。

EntryDate,HH_ID,HH_type,ID#,Age,First,Last,Gender,Race,Ethnicity,CaseWorkerName

完全に一致する約2000のデータ行があります。

CaseWorkerName他の列のすべての値をソートしてソートしたいです。

これを達成するための最良の方法は何ですか?

ベストアンサー1

11列ですCaseWorkerNamesortソート基準となる列と列を指定するときに使用する区切り文字をユーティリティに通知できます。

$ 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実装では、headsubprocess((...))の標準入力が最初に消費され、残りheadのデータが供給されますsort。子プロセスの出力はの出力で、headその後はの出力に従いますsort

他のシステムでは、head標準入力ストリームで予想以上に消費する可能性があります。これはsort何も提供しません(または少なくともファイルの残りの部分は提供しません)。少なくともOpenBSDでは。

結果はdata.out上記の各例に従います。

列のデータにカンマが含まれている場合、これらのメソッドはすべて失敗します。

おすすめ記事