Bash 使用Do while循环时打印唯一值

Bash 使用Do while循环时打印唯一值,bash,sorting,Bash,Sorting,我有一个名为textfile.txt的文件,如下所示: a 1 xxx b 1 yyy c 2 zzz d 2 aaa e 3 bbb f 3 ccc 我试图用其中唯一的值过滤第二列。我有以下代码: while read LINE do compname=`echo ${LINE} | cut -d' ' -f2 | uniq` echo -e "${compname}" done < textfile.txt 但我正在寻找一个输出,如: 1 2 3

我有一个名为
textfile.txt
的文件,如下所示:

a 1 xxx
b 1 yyy
c 2 zzz
d 2 aaa
e 3 bbb
f 3 ccc
我试图用其中唯一的值过滤第二列。我有以下代码:

while read LINE
  do
    compname=`echo ${LINE} | cut -d' ' -f2 | uniq`
        echo -e "${compname}"
    done < textfile.txt
但我正在寻找一个输出,如:

1
2
3
我尝试了另一个命令,如:
echo${LINE}cut-d'-f2 | sort-u | uniq
仍然不是预期的产出


有人能帮我吗?

没有必要循环,
sort-u
已经处理了整个输入

cut -d' ' -f2 textfile.txt | sort -u
也许您希望以原始顺序获得输出,只显示第一次出现的结果?可以使用关联数组来记住已看到的值:

#! /bin/bash
declare -A seen
while read x ; do
    [[ ${seen[$x]} ]] || printf '%s\n' "$x"
    seen[$x]=1
done < <(cut -d' ' -f2 textfile.txt)
#/bin/bash
声明-已见
读x时;做
[${seed[$x]}]| | printf'%s\n''$x'
所见[$x]=1

完成<无需循环,
sort-u
已处理整个输入

cut -d' ' -f2 textfile.txt | sort -u
也许您希望以原始顺序获得输出,只显示第一次出现的结果?可以使用关联数组来记住已看到的值:

#! /bin/bash
declare -A seen
while read x ; do
    [[ ${seen[$x]} ]] || printf '%s\n' "$x"
    seen[$x]=1
done < <(cut -d' ' -f2 textfile.txt)
#/bin/bash
声明-已见
读x时;做
[${seed[$x]}]| | printf'%s\n''$x'
所见[$x]=1

完成<尝试在
done
语句之后移动
sort-u
sort | uniq
,如下所示:

while read LINE;
  do
compname=$(echo ${LINE} | cut -d' ' -f2)
    echo "${compname}"
done < textfile.txt | sort -u
读行时
;
做
compname=$(echo${LINE}| cut-d'-f2)
回显“${compname}”
完成
done
语句之后,尝试移动
sort-u
sort | uniq
,如下所示:

while read LINE;
  do
compname=$(echo ${LINE} | cut -d' ' -f2)
    echo "${compname}"
done < textfile.txt | sort -u
读行时
;
做
compname=$(echo${LINE}| cut-d'-f2)
回显“${compname}”
完成
只需通过管道将循环的输出传输到
sort-u
。不需要
剪切
read
命令可以处理这种类型的拆分

while read -r _ compname _;  do
  echo "$compname"
done < textfile.txt | sort -u
读取时的
-r uu compname u;;做
回显“$compname”
完成
只需通过管道将循环的输出传输到
sort-u
。不需要
剪切
read
命令可以处理这种类型的拆分

while read -r _ compname _;  do
  echo "$compname"
done < textfile.txt | sort -u
读取时的
-r uu compname u;;做
回显“$compname”
完成
uniq
在while主体中没有任何意义-您在其中一次处理一行。此外,在一个文件上循环并在每一行上运行一个操作是一种反模式:请看一看,这是一个很好的解释。感谢您的评论,我删除了uniq命令。我同意while循环不是必需的,但用户明确要求提供包含它的解决方案…理想情况下,您将展示如何修复问题中的方法,然后展示一个数量级更好的方法。同样,这里的变量和两个echo语句似乎是支持不需要的循环的关键,除非有人认为需要保留原始未排序的订单……而且他已经处理好了。:)uniq
没有任何意义-您在其中一次处理一行。此外,在一个文件上循环并在每一行上运行一个操作是一种反模式:请看一看,这是一个很好的解释。感谢您的评论,我删除了uniq命令。我同意while循环不是必需的,但用户明确要求提供包含它的解决方案…理想情况下,您将展示如何修复问题中的方法,然后展示一个数量级更好的方法。同样,这里的变量和两个echo语句似乎是支持不需要的循环的关键,除非有人认为需要保留原始未排序的订单……而且他已经处理好了。:)如果文件保证该列已按所需的排序顺序排列,您可以使用
uniq
来节省一些处理,但我更喜欢这里建议的
sort-u
,除非您确定。:)@保尔·霍奇斯:是的,但唯一能确定的方法是包括
sort-u
;-)是的!“做”和“不做”比“需要”和“不做”更好。如果文件保证已经按所需的排序顺序包含该列,您可以使用
uniq
节省一些处理,但我更喜欢这里建议的
排序-u
,除非您确定。:)@保尔·霍奇斯:是的,但唯一能确定的方法是包括
sort-u
;-)是的!“做而不需要”比“需要而不做”要好。我本来打算使用
uniq
,但是@choroba在使用
sort-u
方面有一个好的观点,我没有同时更新这两个地方:)我本来打算使用
uniq
,但是@choroba在使用
sort-u
方面有一个好的观点,我没有同时更新这两个地方:)