【问题标题】:Sorting by unique values of multiple fields in UNIX shell script按 UNIX shell 脚本中多个字段的唯一值排序
【发布时间】:2012-09-14 19:32:15
【问题描述】:

我是 unix 新手,希望能够执行以下操作,但不确定如何操作。

获取一个包含如下行的文本文件:

TR=P567;dir=o;day=su;TI=12:10;stn=westborough;Line=worcester
TR=P567;dir=o;day=su;TI=12:10;stn=westborough;Line=lowell
TR=P567;dir=o;day=su;TI=12:10;stn=westborough;Line=worcester
TR=P234;dir=o;day=su;TI=12:10;stn=westborough;Line=lowell
TR=P234;dir=o;day=su;TI=12:10;stn=westborough;Line=lowell
TR=P234;dir=o;day=su;TI=12:10;stn=westborough;Line=worcester

然后输出:

TR=P567;dir=o;day=su;TI=12:10;stn=westborough;Line=worcester
TR=P567;dir=o;day=su;TI=12:10;stn=westborough;Line=lowell
TR=P234;dir=o;day=su;TI=12:10;stn=westborough;Line=lowell
TR=P234;dir=o;day=su;TI=12:10;stn=westborough;Line=worcester

我希望脚本能够为每个 TR 值找到具有唯一 Line 值的所有行。

谢谢

【问题讨论】:

  • 您能否编辑您的问题以包括 (1) 示例输入、(2) 示例输出和 (3) 您目前拥有的代码?另外——你为什么要在 C 中这样做?似乎使用常见的 GNU 实用程序会更简单,grepsortsed 等等。

标签: c unix sorting unique field


【解决方案1】:

既然你显然没问题。在dirdayTIstn 的值中随机选择,您可以这样写:

sort -u -t ';' -k 1,1 -k 6,6 -s < input_file > output_file

解释:

  • sort 实用程序“文本文件的行排序”允许您对文件中的行进行排序/比较/合并。 (见the GNU Coreutils documentation。)
  • -u--unique 选项“仅输出相等运行的第一个”告诉sort,如果两个输入行相等,那么您只需要其中一个。
  • -k POS[,POS2]--key=POS1[,POS2] 选项,“在 POS1(原点 1)开始一个键,在 POS2(默认行尾)结束”,告诉 sort 我们想要的“键”在哪里排序方式。在我们的例子中,-k 1,1 表示一个键由第一个字段组成(从字段 1 到字段 1),-k 6,6 表示一个键由第六个字段组成(从字段 6 到字段6)。
  • -t SEP--field-separator=SEP 选项告诉sort 我们要使用SEP(在我们的例子中为';')来分隔和计数字段。 (否则,它会认为字段由空格分隔,在我们的例子中,它会将整行视为单个字段。)
  • -s--stabilize 选项“通过禁用最后的比较来稳定排序”告诉sort 我们想以我们指定的方式比较行;如果两行具有相同的上述“键”,则它们被认为是等效的,即使它们在其他方面有所不同。由于我们使用的是-u,这意味着其中一个将被丢弃。 (如果我们不使用 -u,这只是意味着 sort 不会重新排序它们。)

【讨论】:

  • 我只想要第一个和第六个字段的唯一组合,我不希望中间值考虑
  • @AdamWilner:我不明白你的意思:你的示例输出仍然包含那些中间值。你是说,如果相同的TRLine 出现两次,但day 的值不同,那么你希望day 的值之一被随机丢弃?
  • 是的或多或少。我想只留下带有 TR 和 Line 独特组合的线条。中间的值不应该被考虑到该行是否唯一。在这段代码中它们恰好是相同的,但我有一个超过 8000 行的文本文件,并且它们因行而异
  • 感谢@ruakh,这正是我所需要的
  • 我无法抑制“我也是!”评论 :) 那一个班轮真的很棒,很容易适应我的需要。太棒了。
猜你喜欢
  • 2013-01-24
  • 2016-02-25
  • 2010-10-11
  • 1970-01-01
  • 2011-09-14
  • 2012-02-17
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多