如何从linux中的分隔字符串中找到min String?

时间:2017-04-24 09:08:31

标签: linux bash

我有一个存储在变量中的分隔字符串。

date_str = 2017-04-03,2017-04-04,2017-04-05

如何使用linux

从这个分隔的字符串中取出min值

预期输出为 - > 2017年4月3日

有人可以帮我这么做吗?

5 个答案:

答案 0 :(得分:3)

gawk 方法:

awk -v d=$date_str 'BEGIN{split(d,a,","); asort(a); print a[1]}'

输出:

2017-04-03

split(d,a,",") - 将“日期”字符串拆分为由,

分隔的各个部分

asort(a) - 对数组值进行排序

a[1] - 表示排序数组的第一项

答案 1 :(得分:1)

使用awk:

$ awk -v d=$date_str '     # set variable to awk var d
BEGIN {
    n=split(d,a,",")       # split to a on ,
    for(i=1;i<=n;i++)      # iterate thru a
        if(m==""||a[i]<m)  # compare to current min m
            m=a[i]      
    print m                # after everything print min m
}'
2017-04-03

关于评论:

$ echo $date_str | awk -v RS=, 'NR==1||$0<m{m=$0}END{print m}'
2017-04-03

答案 2 :(得分:1)

使用此命令: echo "date_str = 2017-04-03,2017-04-04,2017-04-05" | grep -Po "[0-9][^,]+" | sort -n | head -n 1

结果是: 2017-04-03

答案 3 :(得分:0)

如果您需要按日期排序

#!/bin/sh

STR='2017-04-03,2017-04-04,2017-04-05,2017-02-23,2017-04-25,2017-03-12,2016-08-25';

TS_ARR=();
IFS=',' read -r -a dates <<< $STR
for next_date in ${dates[@]}; do
  date_ts=`date --date="${next_date}" +%s`
  TS_ARR+=($date_ts)
done
IFS=$'\n' SORT_TS=($(sort <<< "${TS_ARR[*]}"))
echo "sorted: `date -d @${SORT_TS[0]} +%Y-%m-%d`"

应该显示sorted: 2016-08-25

答案 4 :(得分:0)

这是一个解决方案,将字符串从纪元转换为秒,对它们进行排序,抓取第一个并将其转换回字符串:

date_str="2017-04-03,2017-04-04,2017-04-05"
while IFS=, read -r -a arr || [[ -n $arr ]]; do
    for str in ${arr[*]}; do
        echo $(date -d "$str" +%s)
    done
done <<<"$date_str" |
sort -n |
head -n 1 |
{ read -r earliest; date -d @"${earliest}" +%F ; }