grep 和排序选项

grep 和排序选项

我有以下列标题:

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上面每个示例之后。

请注意,如果任何列中的数据包含逗号,所有这些方法都将失败...

相关内容