排序在bash一个CSV行(Sort a CSV row in bash)

2019-10-19 07:13发布

从命令的输出被发送作为的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

干杯。

Answer 1:

用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


Answer 2:

使用shell

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


文章来源: Sort a CSV row in bash