对具有特定列的文件进行排序和唯一化,并仅保留给定文件中的第一个值

sort and uniq a file with a specific column and only keep 1st value from given file

我有示例文件

$ cat a.csv
a,1,c
b,1,d
d,3,a
s,2,c
a,3,s

必填

a,1,c
s,2,c
a,3,s

它必须删除 uniq 之后的所有其他值,但只保留第一个值

排序和 uniq

a,1,c
s,2,c
a,3,s

我尝试 sort -k2 -n a.csv 但给了我这个结果

a,1,c
a,3,s
b,1,d
d,3,a
s,2,c

当我尝试 sort -k2 -n a.csv | uniq -d 我得到的结果是空白

$ sort -t, -u -k2,2 a.csv 
a,1,c
s,2,c
d,3,a
  • -t, 指定 , 作为分隔符
  • -u 仅获取唯一条目
  • -k2,2 使用第二列作为排序标准

awk 中的另一个:

$ awk -F, '{if(!( in a)||[=10=]<a[])a[]=[=10=]}END{for(i in a)print a[i]}' file

输出(以 awk 默认顺序):

a,1,c
s,2,c
a,3,s

解释:

$ awk -F, '                                  # fields comma-separated
{
    if(!( in a) || [=12=]<a[])               # if  unseen or record < stored record
        a[]=[=12=]                             # store it to a hash
}
END {                                        # after processing the file
    # PROCINFO["sorted_in"]="@ind_num_desc"  # sort output on  if using GNU awk
    for(i in a)                              # iterate all stored instances in a 
        print a[i]                           # and output
}' file

输出顺序将是 awk 默认的,即。可能会随机出现。如果要对输出进行排序,则需要使用 sort 或者如果您使用的是 GNU awk,请取消注释解释版本中的 PROCINFO["sorted_in"]="@ind_num_desc" (或将行添加到单行)。