Ler linha e coluna num arquivo de texto [RESOLVIDO]

1. Ler linha e coluna num arquivo de texto [RESOLVIDO]

Iago Lira
iagolira

(usa Debian)

Enviado em 21/12/2014 - 01:52h

Olá pessoal!


Tenho um arquivo com o seguinte conteúdo:


a11 a12 ... a1n
a21 a22 ... a2n
. . .
. . .
. . .
am1 ... amn


Eu estou querendo criar um script que só leia uma linha e coluna por vez, em vez de ler uma linha ou coluna(Ex: ler somente a2n ou a21). Só que não sei como fazer isso em SHELL SCRIPT.
Se alguém poder me ajudar ficarei muito grato!


  


2. MELHOR RESPOSTA

Perfil removido
removido

(usa Nenhuma)

Enviado em 21/12/2014 - 20:26h

Os exemplos a seguir talvez ajudem (pulei a parte de leitura das variáveis 'i' e 'j'):


1. Puro shell-script:

line=1
while read -a arr; do
if (( line == j ))
then echo ${arr[((i - 1))]}
break
fi
let line++
done < teste.txt

2. AWK in-line:

awk -v i=$i -v j=$j 'NR == j { print $i; exit; }' teste.txt

3. Sed in-line:

sed -e $j'{s/\(\S\+\)/\n&\n/'$i';s/\n[^\n]*$//;s/[^\n]*\n//};'$j'q;d' teste.txt


3. Re: Ler linha e coluna num arquivo de texto [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 21/12/2014 - 10:41h

passosfil escreveu:

Olá pessoal!


Tenho um arquivo com o seguinte conteúdo:


a11 a12 ... a1n
a21 a22 ... a2n
. . .
. . .
. . .
am1 ... amn


Eu estou querendo criar um script que só leia uma linha e coluna por vez, em vez de ler uma linha ou coluna(Ex: ler somente a2n ou a21). Só que não sei como fazer isso em SHELL SCRIPT.
Se alguém poder me ajudar ficarei muito grato!


Descrição confusa. Você começou dizendo que pretende fazer o script ler uma linha e coluna por vez e, em seguida, negou esta intenção. Teria como fazer um exemplo do que espera como saída? Por exemplo, supondo que seja usado um comando ou script e que seu arquivo tenha o nome "arquivo.txt":

$ comando arquivo.txt

Qual seria uma possível saída aqui? Apenas uma coluna de uma linha? Por exemplo, "comando" produziria apenas "am1" com saída? Ou não é nada disto o que pretende fazer? O que procura é conseguir manipular esses dados dentro de um script como se fossem uma matriz?

Por fim, quais são os caracteres que separam as colunas do arquivo? Um ou múltiplos caracteres de espaço, um caractere de tabulação ou ainda algum outro?



4. Re: Ler linha e coluna num arquivo de texto [RESOLVIDO]

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 21/12/2014 - 15:35h

passosfil escreveu:

Olá pessoal!


Tenho um arquivo com o seguinte conteúdo:


a11 a12 ... a1n
a21 a22 ... a2n
. . .
. . .
. . .
am1 ... amn




Olha , você pode fazer algo assim :


#!/bin/bash

arq=$(cat arquivo.txt)

echo $($arq|awk'{print $1}'
echo $($arq|awk'{print $2}'
echo $($arq|awk'{print $3}'
echo $($arq|awk'{print $4}'


Seria algo assim ?

[]'s

T+



5. Re: Ler linha e coluna num arquivo de texto [RESOLVIDO]

Iago Lira
iagolira

(usa Debian)

Enviado em 21/12/2014 - 17:05h


beowulf@beowulf:~$ cat teste.txt
a11 a12 a13 a14
a21 a22 a23 a24
a31 a32 a33 a34
a41 a42 a43 a44
beowulf@beowulf:~$ echo $($arq | awk '{print $2}')
bash: a11: comando não encontrado


Executei o comando, mas apareceu isso aí!
Existe um arquivo com o seguinte conteúdo:


a11 a12 a13 a14
a21 a22 a23 a24
a31 a32 a33 a34
a41 a42 a43 a44


O que to querendo é um script que leia somente um desses arquivo da matriz. Somente ler uma linha e coluna especificada.

Exemplo:

ler somente a11, a22 ou a44. Exatamente atribuir cada elemento a uma matriz.


6. Re: Ler linha e coluna num arquivo de texto [RESOLVIDO]

Iago Lira
iagolira

(usa Debian)

Enviado em 21/12/2014 - 18:59h

Criei um script assim:


#!/bin/bash

read -p "Digite o numero da linha: " i
read -p "Digite o numero da coluna: " j

c=$(expr "$j - 1")
read -a arr <<< $(cat -e teste.txt | head -n $i | tail -n 1)

echo "${arr[$c]}"


Aqui funcionou, mas se tiver como otimizar agradecerei!


7. Re: Ler linha e coluna num arquivo de texto [RESOLVIDO]

Iago Lira
iagolira

(usa Debian)

Enviado em 21/12/2014 - 19:01h

passosfil escreveu:

Criei um script assim:


#!/bin/bash

read -p "Digite o numero da linha: " i
read -p "Digite o numero da coluna: " j

c=$(expr "$j - 1")
read -a arr <<< $(cat -e teste.txt | head -n $i | tail -n 1)

echo "${arr[$c]}"


Aqui funcionou, mas se tiver como otimizar agradecerei!



Sabendo que o arquivo teste.txt contem os arquivos:


beowulf@beowulf:~$ cat teste.txt
a11 a12 a13 a14
a21 a22 a23 a24
a31 a32 a33 a34
a41 a42 a43 a44




8. Re: Ler linha e coluna num arquivo de texto [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 21/12/2014 - 20:25h

passosfil escreveu:

Criei um script assim:

#!/bin/bash
read -p "Digite o numero da linha: " i
read -p "Digite o numero da coluna: " j
c=$(expr "$j - 1")
read -a arr <<< $(cat -e teste.txt | head -n $i | tail -n 1)
echo "${arr[$c]}"


O comando 'cat' é dispensável. A opção '-e' introduziu um problema na última coluna do arquivo, um caractere '$' no fim de cada linha.



9. Re: Ler linha e coluna num arquivo de texto [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 21/12/2014 - 20:29h

Só percebi agora que inverti a interpretação das variáveis, nos meus exemplos:

i = número da coluna
j = número da linha

:P



10. Re: Ler linha e coluna num arquivo de texto [RESOLVIDO]

Iago Lira
iagolira

(usa Debian)

Enviado em 22/12/2014 - 12:04h

Muito obrigado! Agora meu script ficou assim:


#!/bin/bash


read -p "Digite o numero da linha: " i
read -p "Digite o numero da coluna: " j

sed -e $i'{s/\(\S\+\)/\n&\n/'$j';s/\n[^\n]*$//;s/[^\n]*\n//};'$i'q;d' teste.txt


Um teste somente com os elementos da diagonal principal:


beowulf@beowulf:~/Documentos/SHELL SCRIPT$ cat teste.txt
a11 a12 a13 a14 a15
a21 a22 a23 a24 a25
a31 a32 a33 a34 a35
a41 a42 a43 a44 a45
a51 a52 a53 a54 a55
beowulf@beowulf:~/Documentos/SHELL SCRIPT$ ./ler_linha_coluna2
Digite o numero da linha: 1
Digite o numero da coluna: 1
a11
beowulf@beowulf:~/Documentos/SHELL SCRIPT$ ./ler_linha_coluna2
Digite o numero da linha: 2
Digite o numero da coluna: 2
a22
beowulf@beowulf:~/Documentos/SHELL SCRIPT$ ./ler_linha_coluna2
Digite o numero da linha: 3
Digite o numero da coluna: 3
a33
beowulf@beowulf:~/Documentos/SHELL SCRIPT$ ./ler_linha_coluna2
Digite o numero da linha: 4
Digite o numero da coluna: 4
a44
beowulf@beowulf:~/Documentos/SHELL SCRIPT$ ./ler_linha_coluna2
Digite o numero da linha: 5
Digite o numero da coluna: 5
a55



11. Re: Ler linha e coluna num arquivo de texto [RESOLVIDO]

Iago Lira
iagolira

(usa Debian)

Enviado em 22/12/2014 - 12:10h

Agora usando essa ideia como faço pra excluir somente elemento de linha "i" e coluna "j"? E como faço para substituir um desses elemento?

Exemplo1:

a11 a12 a13 a14 a15
a21 a22 a23 a24 a25
a31 a32 a33 a34 a35
a41 a42 a43 a44 a45
a51 a53 a54 a55


Exempl2:

a11 a12 a13 a14 a15
a21 a22 a23 a24 a25
a31 a55 a33 a34 a35
a41 a42 a43 a44 a45
a51 a52 a53 a54 a55



12. Re: Ler linha e coluna num arquivo de texto [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 22/12/2014 - 14:44h

passosfil escreveu:

Agora usando essa ideia como faço pra excluir somente elemento de linha "i" e coluna "j"? E como faço para substituir um desses elemento?
[/quote]

Para este caso eu recomendo carregar toda a matriz num array em memória. Embora arrays em bash possuam apenas uma dimensão, existem os arrays associativos e com eles podemos construir qualquer dimensão de matriz.

Para carregar esse arquivo num array "multidimensional", podemos fazer:


declare -A matriz # declarando 'matriz' como um array associativo
linha=1
while read -a arr; do
for (( c = 0; c < ${#arr[*]}; c++)); do
let coluna=c+1
index="$linha,$coluna" # adoteu a vírgula apenas por conveniência
matriz["$index"]="${arr[$c]}"
done
let linha+=1
done < teste.txt


Para conferir como ficou em "memória", pode-se usar o comando:

$ set | grep matriz

(não é muito legível).

Agora, para endereçar um elemento específico, basta escrever os índices separados por vírgula:

echo ${matriz[3,2]}

irá imprimir o segundo elemento da terceira linha (imprime 'a55').

Substituição, e reimpressão da matriz ficam fáceis desta forma.

No exemplo que você passou, para remover o segundo elemento da quinta linha, você poderia fazer apenas:

matriz[5,2]=' ' # aqui eu substitui por três espaços por conveniência também :P

e reimprimir o matriz modificada:


for (( i = 1; i <= $linha; i++ )); do
for (( j = 1; j <= $coluna; j++ )); do
arr[j]=${matriz[$i,$j]}
done
echo "${arr[@]}"
unset arr
done
echo "${arr[@]}"







01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts