在bash中对CSV行进行排序

时间:2014-01-30 21:50:04

标签: perl bash sorting csv uniq

命令的输出作为UUID的CSV列表发送。但是,UUID没有排序,因此很难判断一条线是否是唯一的。我想按逗号之间的值排序每一行,然后uniq行。

我知道我可以用awk破解一些东西,但我希望能有一个更清洁/更优雅的单行。有什么想法吗?

修改

以下是一些示例数据:

9166e19c-4794-467e-baad-3f8c2f2656cb,f5553f54-589b-4afd-a8e0-2239b23dc138,ee721e70-a7e2-4da2-a2b0-22bec3432c3d,7e17bf09-e56b-428e-94c9-a7dc50991e00,360b7de7-d7e5-455a-8eb8-0bd856c705ed
9166e19c-4794-467e-baad-3f8c2f2656cb,360b7de7-d7e5-455a-8eb8-0bd856c705ed,7e17bf09-e56b-428e-94c9-a7dc50991e00,f5553f54-589b-4afd-a8e0-2239b23dc138,ee721e70-a7e2-4da2-a2b0-22bec3432c3d
9166e19c-4794-467e-baad-3f8c2f2656cb,ee721e70-a7e2-4da2-a2b0-22bec3432c3d,7e17bf09-e56b-428e-94c9-a7dc50991e00,f5553f54-589b-4afd-a8e0-2239b23dc138,360b7de7-d7e5-455a-8eb8-0bd856c705ed
9166e19c-4794-467e-baad-3f8c2f2656cb,ee721e70-a7e2-4da2-a2b0-22bec3432c3d,360b7de7-d7e5-455a-8eb8-0bd856c705ed,7e17bf09-e56b-428e-94c9-a7dc50991e00,f5553f54-589b-4afd-a8e0-2239b23dc138
9166e19c-4794-467e-baad-3f8c2f2656cb,f5553f54-589b-4afd-a8e0-2239b23dc138,360b7de7-d7e5-455a-8eb8-0bd856c705ed,ee721e70-a7e2-4da2-a2b0-22bec3432c3d,7e17bf09-e56b-428e-94c9-a7dc50991e00
9166e19c-4794-467e-baad-3f8c2f2656cb,360b7de7-d7e5-455a-8eb8-0bd856c705ed,ee721e70-a7e2-4da2-a2b0-22bec3432c3d,f5553f54-589b-4afd-a8e0-2239b23dc138,7e17bf09-e56b-428e-94c9-a7dc50991e00
9166e19c-4794-467e-baad-3f8c2f2656cb,7e17bf09-e56b-428e-94c9-a7dc50991e00,f5553f54-589b-4afd-a8e0-2239b23dc138,360b7de7-d7e5-455a-8eb8-0bd856c705ed,ee721e70-a7e2-4da2-a2b0-22bec3432c3d
9166e19c-4794-467e-baad-3f8c2f2656cb,360b7de7-d7e5-455a-8eb8-0bd856c705ed,ee721e70-a7e2-4da2-a2b0-22bec3432c3d,f5553f54-589b-4afd-a8e0-2239b23dc138,7e17bf09-e56b-428e-94c9-a7dc50991e00
9166e19c-4794-467e-baad-3f8c2f2656cb,f5553f54-589b-4afd-a8e0-2239b23dc138,360b7de7-d7e5-455a-8eb8-0bd856c705ed,7e17bf09-e56b-428e-94c9-a7dc50991e00,ee721e70-a7e2-4da2-a2b0-22bec3432c3d
9166e19c-4794-467e-baad-3f8c2f2656cb,7e17bf09-e56b-428e-94c9-a7dc50991e00,360b7de7-d7e5-455a-8eb8-0bd856c705ed,f5553f54-589b-4afd-a8e0-2239b23dc138,ee721e70-a7e2-4da2-a2b0-22bec3432c3d
9166e19c-4794-467e-baad-3f8c2f2656cb,7e17bf09-e56b-428e-94c9-a7dc50991e00,ee721e70-a7e2-4da2-a2b0-22bec3432c3d,360b7de7-d7e5-455a-8eb8-0bd856c705ed,f5553f54-589b-4afd-a8e0-2239b23dc138
9166e19c-4794-467e-baad-3f8c2f2656cb,ee721e70-a7e2-4da2-a2b0-22bec3432c3d,7e17bf09-e56b-428e-94c9-a7dc50991e00,360b7de7-d7e5-455a-8eb8-0bd856c705ed,f5553f54-589b-4afd-a8e0-2239b23dc138
9166e19c-4794-467e-baad-3f8c2f2656cb,f5553f54-589b-4afd-a8e0-2239b23dc138,360b7de7-d7e5-455a-8eb8-0bd856c705ed,7e17bf09-e56b-428e-94c9-a7dc50991e00,ee721e70-a7e2-4da2-a2b0-22bec3432c3d
9166e19c-4794-467e-baad-3f8c2f2656cb,360b7de7-d7e5-455a-8eb8-0bd856c705ed,7e17bf09-e56b-428e-94c9-a7dc50991e00,f5553f54-589b-4afd-a8e0-2239b23dc138,ee721e70-a7e2-4da2-a2b0-22bec3432c3d

干杯。

2 个答案:

答案 0 :(得分:4)

使用Perl和uniq,您可以这样做:

perl -F, -lane '@A=sort @F; print join(",",@A)' input_file | uniq

编辑:

@A实际上是不必要的,这也有效,而且更短更快。

perl -F, -lane 'print join(",",sort @F)' input_file | uniq

使用的选项:

  • -e =可用于输入一行程序(一个班轮模式)
  • -a =启用自动分割模式,将分割值放在@F数组
  • -F, =将拆分定界符设为逗号
  • -n =导致perl假定while(<>){...}循环您的程序
  • -l =启用自动行结束处理

在这一行@F是一个特殊的数组,包含被拆分的UUID。它被排序并复制到@A数组。然后打印@A,其中的值由,加入。此命令的输出通过管道传送到uniq,因此您只能获得唯一的行。

输出:

360b7de7-d7e5-455a-8eb8-0bd856c705ed,7e17bf09-e56b-428e-94c9-a7dc50991e00,9166e19c-4794-467e-baad-3f8c2f2656cb,ee721e70-a7e2-4da2-a2b0-22bec3432c3d,f5553f54-589b-4afd-a8e0-2239b23dc138

答案 1 :(得分:0)

使用shell

while read i 
do
  echo $i | tr "," "\n" | sort | tr "\n" "," | sed "s/,$//"
  echo 
done < file |sort -u