根据第一列和第二列的值对数据进行排序,并仅输出第一列和第二列唯一的值。

4

我有一个输入文件,其中包含以下数据:

AUD 100 20
USD 200 30
INR 10  20
AUD 100 30
USD 200 40
EUR 50  60
EUR 50  70
AUD 100 11
USD 200 55
INR 10  35

我运行:
cat filename | sort -u -k1,2

它给我以下输出:

AUD 100 20
EUR 50  60
INR 10  20
USD 200 30

我的理解是,sort -u k1,2 对数据进行排序,并根据列#1和#2中唯一组合的值输出结果。基于这个理解,我运行了以下命令:

  cat filename |  sort -u -k1 

根据第一列的唯一值获取输出。因此,我期望得到以下输出:

AUD 100 20
EUR 50  60
INR 10  20
USD 200 30

但实际输出为:
AUD 100 11
AUD 100 20
AUD 100 30
EUR 50  60
EUR 50  70
INR 10  20
INR 10  35
USD 200 55
USD 200 30
USD 200 40

请问有人能解释一下 sort -u -km,n 选项的作用吗?


3
m,n 中的 -k 表示 sort 命令的排序关键字的起始和结束字段。使用 sort -k1,则该排序关键字会影响从第 1 个字段到最后一个字段,因此您看到的是这个结果。您需要使用 sort -k1,1 - iruvar
1
又是一个无用的 cat 的例子 :) 你可以直接将文件名传递给 sort 命令。不需要使用 cat file | sort。 - codeforester
谢谢iruvar,但是如果我使用sort -u -k1,2对数据进行排序,sort如何决定要打印第三列的值? - Vicky
1
“-u”表示稳定排序,因此将返回具有相同键的每个集合中的第一条记录。 - iruvar
1个回答

2

-k <start>,<end>指定了键字段的数字范围。如果您没有指定<end>,它将默认为行尾。因此:

sort -u -k 1 filename

将根据整行排序并打印唯一值。如果您只想考虑第一个关键字(即您期望的结果),则需要执行以下操作:

sort -u -k 1,1 filename

附注:您真的不需要将cat输出导入到sort中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接