Você pode automatizar isso com globbing, especificamente o e
qualificador glob , mais eval
, mas não é bonito e a citação é complicada:
eval paste *.csv(e\''REPLY="<(cut -d, -f1 $REPLY)"'\')
- A parte entre
\'…\'
é algum código a ser executado para cada correspondência do glob. Ele é executado com a variávelREPLY
definida para a correspondência e pode modificá-la. - Eu coloco o código entre aspas simples para que ele não seja expandido quando o glob é analisado.
- O código
REPLY="<(cut -d, -f1 $REPLY)"
gera a string<(cut -d, -f1 file1.csv)
se a correspondência forfile1.csv
. As aspas duplas são necessárias para que a parte após o sinal de igual não seja expandida quando o códigoe
for executado, além de substituir o valor deREPLY
. - Como cada arquivo globbed é substituído por uma string,
Seria melhor esconder a complexidade de uma função. Minimamente testado.
function map {
emulate -LR zsh
local cmd pre
cmd=()
while [[ $# -ne 0 && $1 != "--" ]]; do
cmd+=($1)
shift
done
if ((!$#)); then
echo >&2 "Usage: $0: COMMAND [ARGS...] -- PREPROCESSOR [ARGS...] -- FILES..."
return 125
fi
shift
while [[ $# -ne 0 && $1 != "--" ]]; do
pre+="${(q)1} "
shift
done
if ((!$#)); then
echo >&2 "Usage: $0: COMMAND [ARGS...] -- PREPROCESSOR [ARGS...] -- FILES..."
return 125
fi
shift
eval "${(@q)cmd}" "<($pre${(@q)^@})"
}
Uso de amostra (a sintaxe é remanescente de zargs
):
map paste -- cut -d, -f1 -- *.csv