1

我是 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 值的所有行。

谢谢

4

1 回答 1

4

由于您显然可以在 、 、 和 的值中随机选择dirday因此TIstn可以编写:

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

解释:

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