Я не спец в этом, но если посмотреть в папку:
/home/thesidjway/rasl_ws/src/intel-aero/poky/build/tmp/work/x86_64-linux/ceres/1.0-r0/ceres-cmake
и проверьте, присутствует ли ваш файл cmake в этой папке. Yocto ожидает, что ваш файл cmake будет присутствовать в папке ceres -cmake.
Как отмечалось в другом месте, bash, вероятно, не лучший инструмент для этой работы, вероятно, это проще сделать в Perl или awk. Тем не менее:
#! /bin/bash
print() {
# "${array[*]}" joins the elements with the first characters of IFS as separator
# so we set IFS to the empty string so that the elements are simply concatenated
local IFS=
if (( end - start > 1 )) # more than two consecutive numbers, concatenate
then
printf "%s-%s\t%s\n" "$start" "$end" "${chars[*]}"
elif (( start == end )) # single number, nothing special
then
printf "%s\t%s\n" "$start" "${chars[0]}"
elif (( end - start == 1 )) # two consecutive numbers, print separately
then
printf "%s\t%s\n" "$start" "${chars[0]}" "$end" "${chars[1]}"
fi
}
# An initial read
read -r n a
chars=( "$a" )
start=$n
end=$n
while read -r n a
do
if (( n - end == 1 )) # consecutive numbers, store for printing
then
chars+=( "$a" )
end=$n
continue # move to next line
fi
print # Break in numbers, print stored set
chars=( "$a" ) # reset variables
start=$n
end=$n
done
print # print last set
Если вам не нужны другие строки, вы можете удалить блоки elif
в функции print
.
Пример вывода:
14 R
16 I
21-24 BCQE
33 R
34 L
41 K
62-64 FFM
88 B
Использованиеawk
:
$ awk 'function out() { if (start != "") { if (start == prev) printf("%s\t%s\n", prev, string); else printf("%s-%s\t%s\n", start, prev, string) } } $1 != prev + 1 { out(); start = $1; string = "" } { prev = $1; string = string $2 } END { out() }' file
14 R
16 I
21-24 BCQE
33-34 RL
41 K
62-64 FFM
88 B
Программа awk
:
function out() {
if (start != "") {
if (start == prev)
printf("%s\t%s\n", prev, string)
else
printf("%s-%s\t%s\n", start, prev, string)
}
}
$1 != prev + 1 { out(); start = $1; string = "" }
{ prev = $1; string = string $2 }
END { out() }
Эта программа отслеживает предыдущий номер из 1-го столбца в prev
и конкатенацию 2-го столбца в string
. Когда предыдущий 1-й столбец на единицу меньше текущего 1-го столбца, все, что происходит, это обновление prev
и string
.
При наличии пробела в нумерации вызывается out()
для вывода собранных данных вместе с записанным интервалом. Функция также вызывается в конце ввода.
Слово -вместо -словесный эквивалент вещи для sh
оболочки:
out () {
if [ -n "$start" ]; then
if [ "$start" = "$prev" ]; then
printf '%s\t%s\n' "$prev" "$string"
else
printf '%s-%s\t%s\n' "$start" "$prev" "$string"
fi
fi
}
while read -r num str; do
if [ "$num" -ne "$(( prev + 1 ))" ]; then
out
start=$num
string=""
fi
prev=$num
string=$string$str
done <file
out
Я только что заметил, что это будет объединяться, даже если есть только две строки, следующие друг за другом численно. Возможно, я исправлю это позже, но пока оставлю это здесь.
Решение awk
:
awk '{if(p+1==$1){c+=1}else{ if(c>1){printf "%s-%s %s\n", b, p, s;} c=0;s=""}} c==1{b=p} {p=$1;s=s$2}' file
На этот раз немного читабельнее с пояснениями:
awk '{
if(p+1==$1){
c+=1 # increment the counter if the value is consecutive
} else {
if(c>1){
# print the begin and end values with the concatenated string
printf "%s-%s %s\n", b, p, s;
}
c=0 # reset the counter
s="" # reset the string to print
}
}
c==1{b=p} # set the begin value
{p=$1;s=s$2} # set the previous variable and the string for the next loop
' file
Протестировано с помощью GNU awk
иmawk