我有一个名为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
仍然没有预期的输出。
有人可以帮助我吗?
答案 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 | uniq
或done
:
while read LINE;
do
compname=$(echo ${LINE} | cut -d' ' -f2)
echo "${compname}"
done < textfile.txt | sort -u