Eu acho que seu problema raiz é que você tentou usar a sintaxe bash em um script sh. Bash define extensões para o denominador comum sh; Se você quiser usar recursos específicos do bash, seu script deve começar com #!/bin/bash
, não #!/bin/sh
.
Sh não possui a sintaxe ((…))
para expressões aritméticas. Mas você não precisa dele aqui, você pode usar a sintaxe condicional [ … ]
. No [ … ]
condicional, o operador “menor que” é escrito -lt
.
Chaves {1..2}
são outro recurso bash que não existe no sh. Outro erro no seu script é X=$A+1
, que define X
como uma string como 42+1
se o valor de A
for 42
; Para realizar um cálculo aritmético, você precisa usar a sintaxe de expressão aritmética $((…))
.
Além disso, como observação geral, sempre use aspas duplas em volta das substituições de variáveis .
Outro problema com seu código é que parece que A
é um número decimal. A aritmética da shell só funciona com números inteiros. Eu adaptei o algoritmo, mas verifique o que ele faz, eu poderia não ter arredondado a maneira que você pretendia. Usar o awk só para contar o número de linhas é um exagero, wc -l
é uma maneira mais clara e rápida de fazer isso. Da mesma forma, para imprimir as primeiras N linhas de um arquivo, basta chamar head
.
Ainda outro erro é que $i_chunk
é o valor da variável i_chunk
. Para obter o valor de i
e acrescentar _chunk
, você precisa delimitar o nome da variável com chaves: ${i}_chunk
.
Eu não tenho ideia do que o loop em j
deveria estar fazendo, deixei isso em paz.
#!/bin/sh
for i in 1 2
do
input="../ExpressionSet_${i}_chunk.txt"
for j in 1 2
do
A=$(wc -l <"$input")
Y=100
X=0
if [ "$A" -lt "$Y" ]; then
X=$((A+100))
else
X=$A
fi
head -n "$((X/100))" "$input" > "$i"_top1pc.txt
head -n "$((X/20))" "$input" > "$i"_top5pc.txt
done
done
Se você optar por escrever um script bash, poderá usar vários recursos do bash:
-
((…))
para avaliações aritméticas (mas ainda apenas inteiras) -
typeset -i
para declarar uma variável inteira, de forma que atribuir uma expressão aritmética a avalia
#!/bin/bash
for i in 1 2
do
input="../ExpressionSet_${i}_chunk.txt"
for j in 1 2
do
A=$(wc -l <"$input")
Y=100
typeset -i X
if ((A < Y)); then
X=A+100
else
X=$A
fi
head -n "$((X/100))" "$input" > "$i"_top1pc.txt
head -n "$((X/20))" "$input" > "$i"_top5pc.txt
done
done