我有以下列标题:
EntryDate,HH_ID,HH_type,ID#,Age,First,Last,Gender,Race,Ethnicity,CaseWorkerName
大约有 2000 行数据非常匹配。
我想排序CaseWorkerName
并将其他列中的所有值排列起来。
实现这一目标的最佳方法是什么?
答案1
是CaseWorkerName
第 11 列。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
上面每个示例之后。
请注意,如果任何列中的数据包含逗号,所有这些方法都将失败...