选择unix中唯一的最低行

时间:2013-05-29 21:00:38

标签: bash awk

我在下面的文件中有2个字段。

字段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
Torres_20121231

5 个答案:

答案 0 :(得分:4)

sort -t_ -nk2 abc.lst | awk -F_ '!a[$1]++'

或保存管道并执行此操作 -

awk -F_ '!a[$1]++' <(sort -t_ -nk2 abc.lst)

答案 1 :(得分:0)

awk -F_ '{ l = lowest[$1]; if (!l || $2 < l) { lowest[$1] = $2 } }
         END { for (name in lowest) print name FS lowest[name] }'

(如果输出顺序无关紧要)

答案 2 :(得分:0)

这个单行选择那些条目。但不排序输出:

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

答案 3 :(得分:0)

bash解决方案(未按名称排序):

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

答案 4 :(得分:-2)

使用sort命令:

cat abc.lst | sort -u -t_ -k1,1

并在man sort

上阅读