【问题标题】:Search book by title/author按书名/作者搜索图书
【发布时间】:2013-07-25 07:15:42
【问题描述】:

您好,我是 shell 编程的新手,希望您能指导我,谢谢。

您好,我需要一个函数来从 .txt 文件中搜索书名或作者并回显以下内容

Title:*Enter*
Author:Scissorhands

找到 3 条记录: C++ for dummy,John Scissorhands,15.01 美元、10 美元、5 美元 傻瓜用 Java,Mary Scissorhands,16.02 美元、20 美元、15 美元 VB.NET 傻瓜版,Edward Scissorhands,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
}

【问题讨论】:

  • @triplee 没有在你的 previous 帖子中告诉你 J.K.Rowling 写了哈利波特的书。
  • 这只是一个例子,大声笑,我怎样才能以那种格式展示这本书?星球大战 VI - 绝地归来,obi-Wan kenobi,15.98,20,15 美元,如果我的格式是.txt 是哈利波特:詹姆斯:12.99:197:101

标签: linux bash shell ubuntu


【解决方案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).

并不是说您需要通配符的正则表达式(即. 而不是?.* 而不是* 等),并且您不需要将通配符放在开头/结尾搜索词以在给定(子)字符串中的任何位置查找匹配项。

当然,您也可以完全在 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

【讨论】:

  • 嗨,我想提示用户输入书名或作者,以便代码可以在系统中搜索相关书籍,有没有办法要求用户输入书名和作者而不是使用“星球大战VI”?
  • 谢谢,但我想包括作者、价格、数量和剩余数量,类似于我上面想要的输出
  • 如果我想跳过使用书名而是使用作者作为变量来查找书籍我应该如何更改代码?非常感谢你,你帮了我很大的忙=D
  • 无需更改代码。它已经在查看标题和作者字段。
  • 我想说的是,如果用户决定将标题留空,只是想搜索作者并制作代码,只需拉出相关作者姓名,如我在顶部的例如输出,则程序将要求用户输入 2 个输入,1 是标题,另一个是作者,你能帮我解决这个问题吗?很抱歉打扰你,谢谢!
【解决方案2】:
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

【讨论】:

    【解决方案3】:

    @Wilson Turners 关于 Adrian 帖子的最后一点:

    ./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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      • 2012-10-04
      • 2013-03-30
      • 1970-01-01
      相关资源
      最近更新 更多