Сопоставьте три или более термина подряд в столбце с помощью bash

Я не спец в этом, но если посмотреть в папку:

/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.

2
20.09.2019, 13:26
3 ответа

Как отмечалось в другом месте, 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
0
27.01.2020, 22:08

Использование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

Я только что заметил, что это будет объединяться, даже если есть только две строки, следующие друг за другом численно. Возможно, я исправлю это позже, но пока оставлю это здесь.

1
27.01.2020, 22:08

Решение 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

1
27.01.2020, 22:08

Теги

Похожие вопросы