2013-07-25 40 views
1

嗨,我是新的shell編程,我希望你能引導我一路謝謝。按書名/作者搜索的書

嗨,我需要一個函數來從.txt文件中搜索要麼書名或作者和回聲出以下

Title:*Enter* 
Author:Scissorhands 

找到3個記錄: C++傻瓜,約翰剪刀手,$ 15.01,10,5 Java的傻瓜,瑪麗剪刀手,$ 16.02,20,15 VB.NET傻瓜,剪刀手愛德華,$ 17.03 30,25

Found 3 records : 
C++ for dummies, John Scissorhands, $15.01, 10, 5 
Java for dummies, Mary Scissorhands, $16.02, 20, 15 
VB.NET for dummies, Edward Scissorhands, $17.03, 30, 25 

我的文件格式是如下

書名:作者:價格:數量:數量銷售

哈利波特:詹姆斯:12.99:197:101

function Search_book 
{ 
FILE="/home/student/Downloads/BookDB.txt" 
echo found 1 records : $FILE contents 
cat FILE 
} 
+2

沒有@triplee告訴你在你的[上一個](http://stackoverflow.com/questions/17849131/how-to-use-sed-to-find-the-corresponding-place-in- a-text-file-and-update-it-shel)後,JKRowling寫了哈利波特的書。 – devnull

+0

這只是一個例子哈哈,我怎麼能以這種格式顯示這本書?星球大戰VI - 絕地,阿比旺基諾比的回報,$ 15.98,20,15,如果我的.txt格式是哈利波特:詹姆斯:12.99:197:101 –

回答

1

編輯:對不起,我誤解了你的問題。

更新混合/解決方案:

#!/bin/bash 

read -p "Enter search term: " search 
perl -ne ' 
    BEGIN{ $pattern = $ARGV[0]; shift; $n=0 } 
    @a=split /:/; 
    if ($a[0] =~ m/$pattern/i or $a[1] =~ m/$pattern/i) { 
     print "$a[0], $a[1],\$$a[2],$a[3],$a[4]\n"; 
     $n += 1; 
    } 
    END{ print "Found $n title(s).\n" } 
    ' "$search" /home/student/Downloads/BookDB.txt 

輸出:

$ ./search.sh 
Enter search term: star wars vi 
Title: Star wars VI - return of the jedi 
Found 1 title(s).

不是你需要的通配符正則表達式(IE的.代替?*.*代替等) ,並且您不需要在搜索項的開始/結尾放置通配符,以便在給定(子)字符串中的任何位置查找匹配項。

當然,你也可以這樣做完全是在Perl,而shell腳本:

#!/usr/bin/env perl 

use strict; 
use warnings; 

my $booklist = './books.txt'; 
my @book; 

print "Enter search term: "; 
chomp (my $pattern = <>); 

open BOOKS, "<$booklist" or die $!; 

my $n = 0; 
foreach (<BOOKS>) { 
    chomp; 
    @book = split /:/; 
    if ($book[0] =~ m/$pattern/i or $book[1] =~ m/$pattern/i) { 
    print "$book[0], $book[1],\$$book[2],$book[3],$book[4]\n"; 
    $n += 1; 
    } 
} 

close BOOKS; 

print "Found $n title(s).\n"; 

對於的解決方案看Adrian Frühwirth's answer

+0

嗨,我想提示用戶輸入書名或作者,以便代碼可以在系統中搜索相關書籍,是否有方法要求用戶輸入書名和作者比使用「星球大戰VI」? –

+0

謝謝,但我想包括作者,價格,數量和數量留在,類似於我的上述期望的輸出 –

+0

你是最好的謝謝很多= D –

1
search_book() 
{ 
    awk -F':' -v search="$1" '$1 ~ search || $2 ~ search { i++; printf "%s, %s,$%s,%s,%s\n", $1, $2, $3, $4, $5 } END { printf "%d records found\n", i }' books.txt 
} 

_

$ cat books.txt 
X never marks the spot:Indiana Jones:9.99:1:1 
A fistful of barnacles:Captain Twiddlymore:9.99:2:1 
The time I blew up LeChuck:Guybrush Threepwood:8.99:100:60 
When I blew up LeChuck:Guybrush Threepwood:8.99:100:50 
Where I blew up LeChuck:Guybrush Threepwood:8.99:100:2 

_

$ search_book Indiana 
X never marks the spot, Indiana Jones,$9.99,1,1 
1 records found 

$ search_book Guybrush 
The time I blew up LeChuck, Guybrush Threepwood,$8.99,100,60 
When I blew up LeChuck, Guybrush Threepwood,$8.99,100,50 
Where I blew up LeChuck, Guybrush Threepwood,$8.99,100,2 
3 records found 

$ search_book barnacle 
A fistful of barnacles, Captain Twiddlymore,$9.99,2,1 
1 records found 

$ search_book foo 
0 records found 
+0

+1雖然,我會添加'BEGIN {IGNORECASE = 1}'。 –

+0

@AnsgarWiechers好點! –

+0

@AdrianFrühwirth如何將awk代碼放入我的編碼中? –

0

@上阿德里安的帖子威爾遜特納最後一點:

./book.sh 
Enter search term: barnacle 
A fistful of barnacles, Captain Twiddlymore,$9.99,2,1 
1 records found 

這裏是你如何調用內現有的awk的功能代碼:

#!/bin/bash 
    search_book() 
{ 
    awk -F':' -v search="$search" '$1 ~ search || $2 ~ search { i++; printf "%s, %s,$%s,%s,%s\n", $1, $2, $3, $4, $5 } END { printf "%d records found\n", i }' books.txt 
} 


read -p "Enter search term: " search 

search_book