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
方面有一个好的观点,我没有同时更新这两个地方:)