我有一个数字列表(没有重复项)val_str="11 22 33"
,可以根据需要将其存储为数组,例如:val_arr=(11 22 33)
。
我还有第二个数字列表,这些数字来自制表符分隔文件中的字段。如果需要,我可以将这些数字写到一个单独的文件中awk
。以下是一些玩具数据:
echo -e "66\n55\n99\n33\n11\n88\n77\n22\n33" > list
我想找到在val_arr
中第一个出现的元素的值list
。的某些元素val_arr
可能不会出现在中list
。如果中的所有元素都val_arr
出现在下面的代码中,则可以工作list
,但如果不是这样的话,则失败,例如if val_arr=(11 44 22 33)
。
val_arr=(11 22 33)
echo -e "66\n55\n99\n33\n11\n88\n77\n22\n33" > list
pos_arr=()
for i in ${!val_arr[@]}; do
list_pos=$(grep -nm 1 ${val_arr[$i]} list | cut -f1 -d:)
pos_arr+=( ${list_pos} )
done
pos1=$(echo ${pos_arr[@]} | tr ' ' '\n' | awk 'NR==1 {min=$0} NR>1 && $1<min {min=$1; pos=NR} END {print pos}')
pos0=$(( pos1 - 1 ))
val=${val_arr[$pos0]}
对于两者val_arr=(11 22 33)
,val_arr=(11 44 22 33)
我都希望脚本返回33
。
我的问题是:
val_arry
到list
with的末尾更优雅echo ${pos_arr[@]} | tr ' ' '\n' >> list
)?谢谢!
PS感谢@AdrianFrühwirthawk
从此处提供了上面的代码:https : //stackoverflow.com/questions/16610162/bash-return-position-of-the-smallest-entry-in-an-array
如何val_arr
变成grep模式或表达式列表
$ echo "${val_arr[@]/#/-e}"
-e11 -e44 -e22 -e33
并直接使用它?
$ grep -wFm1 "${val_arr[@]/#/-e}" list
33
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句