вы можете передавать переменные в awk
, и ваша команда будет выглядеть так:
awk -v col1=1 -v col2=2 '{ for(i=1; i<=NF;i++) {if (i == $col1 || i == $col2 ) sum+=$i}; print(sum); sum=0 }' $FILE
-v
var = value
присваивает значение программной переменной var. вы можете добавить столько столбцов, сколько хотите, просто добавьте -v colx = value
, а затем добавьте ot к условию || i == $ colx
Если вы хотите передать номер столбца в сценарий оболочки, вы можете добавить их в массив, скажем, columnsArray
, а затем создать переменную columns = $ (echo " $ {columnsArray [@]} ")
, тогда ваша команда должна выглядеть так:
awk -v outCols="$columns" 'BEGIN{split(outCols, cols, " ")} { for(i=1; i<=NF;i++) {if (i in cols ) sum+=$i}; print(sum); sum=0 }' $FILE
например,
#!/bin/bash
columns=$(echo "$@")
awk -vcolss="$columns" 'BEGIN{split(colss, cols, " ")}{ for(i=1; i<=NF;i++) {if (i in cols ) sum+=$i}; print(sum); sum=0 }' test
вернет:
3
3
1
Вы можете создать функцию, которая это сделает. Это не идеально, абсолютно не портативно, но, похоже, работает. Чтобы использовать его в $PS1
, вам просто нужно изменить $fg_
и$bg_
(на %F
/%B
или $fg
/$bg
, я не помню )и setup и precmd hook(add-zsh-hook precmd function_precmd
)с функцией, которую вы создадите и которая будет изменять переменную, используемую в $PS1
.
Для настройки функции необходимо правильно установить PRE _ASSOC.
function colorize_array () {
local reset='\033[0m'
for (( i = 1; i <= $# ; i++ )); do
pre=""
if (( $+PRE_ASSOC[$i] )); then
pre=$PRE_ASSOC[$i]
elif (( $+PRE_ASSOC[$(( $i - $# - 1 ))] )) ;then
pre=$PRE_ASSOC[$(( $i - $# - 1 ))]
else
pre=$PRE_ASSOC[default]
fi
echo -n -e $pre$@[$i]$reset
done
}
typeset -A fg_ bg_
typeset -A PRE_ASSOC
fg_=([black]="\033[30m" [white]="\033[37m" [red]="\033[31m" [yellow]="\033[33m" [cyan]="\033[36m")
bg_=([black]="\033[40m" [white]="\033[47m" [red]="\033[41m" [yellow]="\033[43m" [cyan]="\033[46m")
PRE_ASSOC=([default]="$fg_[cyan]/" [1]="$fg_[red]" [-1]="$fg_[yellow]/")
local pwd="${PWD/#$HOME/~}"
pwd_list=(${(s:/:)pwd})
out=$(colorize_array $pwd_list)
echo $out
Код далек от совершенства, но работает.