Lendo por um arquivo csv

0

Eu tenho um arquivo Books.txt que contém os nomes dos livros e as pessoas que o emprestaram. BOOKXXXX é o nome do livro e XXXX são dígitos. Aqui está um exemplo.

BOOK2592,1,2,3,4,5,22
BOOK1234,3,4,5
BOOK0999,4,5,6,7
BOOK0666,10,33,4,5
BOOK2222,1,3,4,5,6,7,88,98,3

Com este arquivo, preciso descobrir se um determinado número de conta emprestou o livro.

Não consegui pensar em nenhuma solução porque estava pensando em como descobrir quantas vezes o livro foi emprestado?

    
por gkmohit 22.07.2014 / 02:30

3 respostas

2

Existem realmente várias solicitações independentes na pergunta original, mas a resposta "qual conta do livro foi emprestada" com o awk pode parecer isso:

cat book.sh 
#!/bin/bash
awk -F"," -v acc=$1 '
{
  for(i=2;i<=NF;i++){
    if($i ~ acc ){
      print $1
    }
  }
}' Books.txt

O que nos dá saída como:

$ ./book.sh 4
BOOK1234
BOOK0999
    
por 22.07.2014 / 04:41
2

Perl é uma excelente linguagem de processamento de texto. Sua sintaxe pode ser ... surpreendente, mas suas estruturas de dados são extremamente flexíveis:

perl -F, -lane '
    $book = shift @F; 
    $books{$book} = [@F]; 
    push @{$users{$_}}, $book for @F; 
} 
END {
    $book="BOOK1234"; 
    printf "book %s has been borrowed %d times, by users %s\n", 
               $book, 
               scalar(@{$books{$book}}), 
               join(",",@{$books{$book}}); 
    $user="1"; 
    printf "user %s has borrowed %d books, %s\n", 
               $user, 
               scalar(@{$users{$user}}), 
               join(",",@{$users{$user}})
' Books.txt
book BOOK1234 has been borrowed 4 times, by users 1,2,3,4
user 1 has borrowed 2 books, BOOK1234,BOOK2334
    
por 22.07.2014 / 04:31
0

Existem algumas opções para fazer isso

  1. Você pode usar o arquivo para o número do livro e, em seguida, grep para a conta

    # grep account books.txt | cut -d "," -f1

    que produz este

    BOOK0999

  2. Ou você pode usar o awk para filtrar o que precisa em awk -F ',' '/9/ { print $1} ' books.txt

    que gera este BOOK0999

Se você quisesse um roteiro, poderia fazê-lo dessa maneira

#!/bin/bash
acct=$1
while read line; do
    if [[ $line =~ $1 ]]; then
            echo $line | cut -d "," -f1
    fi
done < books.txt

e execute o script com ./script acctno

    
por 22.07.2014 / 02:44