Разбор массива как одного из многих параметров ключевого слова в скрипте bash

$ awk -v OFS='\t' -f script.awk file
ID1     76      266
ID2     3762    62      1541

Где script.awkэто

{ printf("%s", $1) }
{ for (i=4; i<=NF; i+=2) { printf("%s%d", OFS, $i - $(i-1) - $(i-2)) } }
{ printf("%s", RS) }

Все блоки будут выполняться для каждой строки ввода из файла.

Первый блок выводит идентификатор.

Второй блок перебирает поля, как вы описали, и выводит данные, разделенныеOFS(разделителем выходных полей, установленным на вкладке в командной строке ).

Последний блок просто выводит разделитель записей RS, который по умолчанию является новой строкой.

Как вариант,

BEGIN { OFS = "\t" }
{ printf("%s", $1) }
{ for (i=4; i<=NF; i+=2) { printf("%s%d", OFS, $i - $(i-1) - $(i-2)) } }
{ printf("%s", RS) }

, чтобы избавиться от необходимости -v OFS='\t'.

Как «один -лайнер»:

$ awk 'BEGIN { OFS = "\t" }
{ printf("%s", $1) }
{ for (i=4; i<=NF; i+=2) { printf("%s%d", OFS, $i - $(i-1) - $(i-2)) } }
{ printf("%s", RS) }' file

Для расширенной задачи:

{ printf("%s", $1) }
{ for (i=4; i<=NF; i+=2) { printf("%s%d%s%d", OFS, $(i-1), OFS, $i - $(i-1) - $(i-2)) } }
{ printf("%s%d%s%s", OFS, $NF, OFS, RS) }

Это создаст следующее прямо из исходного файла:

ID1     234     76      392     266     470
ID2     176     3762    869     62      347     1541    231
1
07.09.2019, 00:23
1 ответ

Попробуйте это:

usage(){ echo 'usage:...'; exit 2; } 
while [ "$#" -gt 1 ]; do
        case $1 in
        --param1) param1=$2; shift 2;;
        --param2) param2=$2; shift 2;;
        --param3) param3=$2; shift 2;;
        --param4)
                shift
                while [ "$#" -gt 0 ]; do
                        case $1 in
                        --param*) break;;
                        *) param4+=("$1"); shift;;
                        esac
                done
                ;;
        *) usage ;;
        esac
done
[ "$#" -gt 0 ] && usage

for p in "${param4[@]}"; do
    echo python "--$p"
done
2
27.01.2020, 23:30

Теги

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