Bash 在unix中选择唯一的最低行
我在下面的文件中有两个字段 字段1是名称,字段2是交易日期 我想要具有最低交易日期的唯一名称Bash 在unix中选择唯一的最低行,bash,awk,Bash,Awk,我在下面的文件中有两个字段 字段1是名称,字段2是交易日期 我想要具有最低交易日期的唯一名称 cat abc.lst John_20130201 David_20130202 Scott_20130203 Li_20130201 John_20130202 Scott_20130201 David_20130201 Li_20130204 Torres_20121231 所需输出 John_20130201 Li_20130201 Scott_20130201 David_20130201 T
cat abc.lst
John_20130201
David_20130202
Scott_20130203
Li_20130201
John_20130202
Scott_20130201
David_20130201
Li_20130204
Torres_20121231
所需输出
John_20130201
Li_20130201
Scott_20130201
David_20130201
Torres_20121231
awk-F{l=lovel[$1];if(!l{124;}$2
(如果输出顺序无关紧要)使用
sort
命令:
cat abc.lst | sort -u -t_ -k1,1
并在
mansort
上阅读相关内容,这一行选择了这些条目。但不会对输出进行排序:
awk -F_ '$1 in a{a[$1]=$2>a[$1]?a[$1]:$2;next}{a[$1]=$2}
END{for(x in a)print x"_"a[x]}' file
或保存一个管道并执行以下操作-
awk -F_ '!a[$1]++' <(sort -t_ -nk2 abc.lst)
awk-F_'![$1]+'纯bash
解决方案(不按名称排序):
输出是如何排序的?或者顺序不重要?嗯,还有一个bash
标记。无论如何,我会用替换cat abc.lst
除了无用的cat之外,您的排序无论如何都不能正常工作。sort
接受文件参数。您需要-k2
和-r
。第一行的格式更紧凑!a[$1]| | a[$1]>$2{a[$1]=$2}
@TrueY这太漂亮了!!
sort -t_ -nk2 abc.lst | awk -F_ '!a[$1]++'
awk -F_ '!a[$1]++' <(sort -t_ -nk2 abc.lst)
declare -A hash
while IFS=_ read nam val; do
[[ -z "${hash[$nam]}" || $val < "${hash[$nam]}" ]] && hash[$nam]=$val
done <abc.lst
for i in ${!hash[*]}; do echo ${i}_${hash[$i]}; done
David_20130201
Li_20130201
John_20130201
Scott_20130201
Torres_20121231