管道输出到uniq或sort -u不返回预期结果

时间:2019-01-27 19:55:32

标签: bash

我有成千上万个文件,它们的名称具有相似的名称,并且经常重复前缀。我想遍历所有文件名并获取唯一前缀的列表。

  

AB-61-GA_0001c.txt
  AB-61-GA_aseguh.xml
  AM-81-BU_0678.mp4
  AM-81-BU_ochyu.doc
  AM-92-LA_gatyt.csv

我想结束输出:

  

AB-61-GA
  AM-81-BU
  AM-92-LA

为此,我整理了以下shell脚本

#!/bin/bash
for i in *.*
do
    UNIQUEOBJECT=$(echo "$i" | cut -d '_' -f 1 | sort -u)
    echo "$UNIQUEOBJECT"
done

由于某种原因,我最终得到了前缀列表(下划线之前的所有内容),并且仍然重复相同的前缀。显然,这只是我对bash脚本的不了解,但是我在做什么错呢? 谢谢

1 个答案:

答案 0 :(得分:2)

问题是您的for循环一次发送一个文件名。因此,您可以对单个文件名进行排序和唯一化。

您可以做类似的事情(语法可能不太正确,因为我目前没有用于测试的Linux机器)

#!/bin/bash
UNIQUEOBJECT=$(for i in *.*
do
    echo "$i"
done | cut -d '_' -f 1 | sort -u)
echo "$UNIQUEOBJECT"

在排序之前,您需要生成列表。您的原件是在排序后生成列表的。