Bash 数组中最长的字符串元素对或对的最长边
Longest pair of string elements or longest side of the pairs in Bash array
给定数组 Bash:
my_array=("a" "b" "a bc" "d" "ab" "cd")
将数组中的每两个连续项视为一个 pair
,我如何:
- 获取最长对的长度。在上面的例子中它将是
"a bc" "d"
,所以长度 5
.
- 获取对中最长的拳头项目的长度。上面是
"a bc"
,所以长度是 4
.
- 获取对中第二项中最长项的长度。上面是
"cd"
,所以长度是 2
.
诀窍是使用 for
循环,每次将索引变量递增 2。其他一切都是基本参数扩展,以获取元素的长度并针对当前最大值进行测试。
#!/usr/bin/env bash
declare -a my_array=("a" "b" "a bc" "d" "ab" "cd")
declare -i maxlen_combo=0 maxlen_first=0 maxlen_second=0
IFS=""
for (( i = 0; i < ${#my_array[@]}; i += 2 )); do
if [[ $maxlen_first -lt ${#my_array[i]} ]]; then
maxlen_first=${#my_array[i]}
fi
if [[ $maxlen_second -lt ${#my_array[i+1]} ]]; then
maxlen_second=${#my_array[i+1]}
fi
combo="${my_array[*]:i:2}"
if [[ $maxlen_combo -lt ${#combo} ]]; then
maxlen_combo=${#combo}
fi
done
echo "Maximum pair length: $maxlen_combo"
echo "Maximum first length: $maxlen_first"
echo "Maximum second length: $maxlen_second"
您可以使用
printf "%s\n" ${my_array[@]} |
awk '{itemlen=length([=10=])}
NR%2==1 {
firstmaxlen = (itemlen > firstmaxlen) ? itemlen : firstmaxlen;
firsthalf=itemlen
}
NR%2==0 {
secondmaxlen = (itemlen > secondmaxlen) ? itemlen : secondmaxlen;
pairlen = (firsthalf + itemlen > pairlen ) ? firsthalf + itemlen : pairlen ;
}
END { printf ("maxcombo, maxfirst, maxsecond) = (%d, %d, %d)\n",
pairlen, firstmaxlen, secondmaxlen) }
'
在这种情况下,一个小函数可以提供帮助:
printf "%s\n" ${my_array[@]} |
awk 'function max(a,b) { return (a>b ? a : b) }
{itemlen=length([=11=])}
NR%2==1 {
firstmaxlen = max(itemlen, firstmaxlen);
firsthalf=itemlen
}
NR%2==0 {
secondmaxlen = max(itemlen, secondmaxlen);
pairlen = max(firsthalf + itemlen, pairlen);
}
END { printf ("maxcombo, maxfirst, maxsecond) = (%d, %d, %d)\n",
pairlen, firstmaxlen, secondmaxlen) }
'
给定数组 Bash:
my_array=("a" "b" "a bc" "d" "ab" "cd")
将数组中的每两个连续项视为一个 pair
,我如何:
- 获取最长对的长度。在上面的例子中它将是
"a bc" "d"
,所以长度5
. - 获取对中最长的拳头项目的长度。上面是
"a bc"
,所以长度是4
. - 获取对中第二项中最长项的长度。上面是
"cd"
,所以长度是2
.
诀窍是使用 for
循环,每次将索引变量递增 2。其他一切都是基本参数扩展,以获取元素的长度并针对当前最大值进行测试。
#!/usr/bin/env bash
declare -a my_array=("a" "b" "a bc" "d" "ab" "cd")
declare -i maxlen_combo=0 maxlen_first=0 maxlen_second=0
IFS=""
for (( i = 0; i < ${#my_array[@]}; i += 2 )); do
if [[ $maxlen_first -lt ${#my_array[i]} ]]; then
maxlen_first=${#my_array[i]}
fi
if [[ $maxlen_second -lt ${#my_array[i+1]} ]]; then
maxlen_second=${#my_array[i+1]}
fi
combo="${my_array[*]:i:2}"
if [[ $maxlen_combo -lt ${#combo} ]]; then
maxlen_combo=${#combo}
fi
done
echo "Maximum pair length: $maxlen_combo"
echo "Maximum first length: $maxlen_first"
echo "Maximum second length: $maxlen_second"
您可以使用
printf "%s\n" ${my_array[@]} |
awk '{itemlen=length([=10=])}
NR%2==1 {
firstmaxlen = (itemlen > firstmaxlen) ? itemlen : firstmaxlen;
firsthalf=itemlen
}
NR%2==0 {
secondmaxlen = (itemlen > secondmaxlen) ? itemlen : secondmaxlen;
pairlen = (firsthalf + itemlen > pairlen ) ? firsthalf + itemlen : pairlen ;
}
END { printf ("maxcombo, maxfirst, maxsecond) = (%d, %d, %d)\n",
pairlen, firstmaxlen, secondmaxlen) }
'
在这种情况下,一个小函数可以提供帮助:
printf "%s\n" ${my_array[@]} |
awk 'function max(a,b) { return (a>b ? a : b) }
{itemlen=length([=11=])}
NR%2==1 {
firstmaxlen = max(itemlen, firstmaxlen);
firsthalf=itemlen
}
NR%2==0 {
secondmaxlen = max(itemlen, secondmaxlen);
pairlen = max(firsthalf + itemlen, pairlen);
}
END { printf ("maxcombo, maxfirst, maxsecond) = (%d, %d, %d)\n",
pairlen, firstmaxlen, secondmaxlen) }
'