使用Do-While循环时打印唯一值

时间:2018-07-23 16:30:43

标签: bash sorting

我有一个名为foreach ($students as $student_row){ //get each student's ID $studentID = $student_row['studentID']; foreach ($allExams as $allExam) { //get each exam's ID $examID = $allExam['examID']; foreach ($subjects as $subject){ //get each subject's ID $subjectID = $subject['subjectID']; $obtained_mark_query = $this->db->query("select * from mark where mark.studentID = '$studentID' && mark.examID = '$examID' && mark.subjectID = '$subjectID'")->row()->mark; //to get mark for each student per exam per subject } } } 的文件,如下所示:

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
1
2
2
3
3

我尝试了另一个命令,例如:1 2 3 仍然没有预期的输出。

有人可以帮助我吗?

3 个答案:

答案 0 :(得分:3)

无需循环,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)

仅对于最后一次出现,将最后一行更改为

done < <(cut -d' ' -f2 textfile.txt | tac) | tac

(即最后一次出现是倒序出现的第一次出现)

答案 1 :(得分:1)

只需将循环的输出传递到date。无需2018-06-08 function convert(str) { var date = new Date(str); var mnth = ("0" + (date.getMonth() + 1)).slice(-2); var day = ("0" + date.getDate()).slice(-2); return [date.getFullYear(), mnth, day].join("-"); } var data = [ "Mon Jul 16 2018 21:54:14 GMT+0530 (India Standard Time)", "Mon Jul 16 2018 21:54:14 GMT+0530 (India Standard Time)" ]; console.log(data.map(convert));命令可以处理这种拆分。

data

答案 2 :(得分:0)

尝试像这样在sort -u语句之后移动sort | uniqdone

while read LINE;
  do
compname=$(echo ${LINE} | cut -d' ' -f2)
    echo "${compname}"
done < textfile.txt | sort -u