bash:从文本文件中搜索相似的单词

时间:2013-01-07 15:36:25

标签: bash awk grep

我有一个示例文本文件abc.txt,其中包含一些值:

Harry Potter - A:JK:1:1:1
Harry Potter - B:JK:1:1:1
Hairy Potter - C:Harry:1:1:1

:是值之间的分隔符。目前,我正在尝试grep类似的值并与第一列进行比较并打印出行。

grep -i "harry" BookDB.txt | awk -F ':' '{print $0}'

它产生:

Harry Potter - A:JK:1:1:1
Harry Potter - B:JK:1:1:1
Hairy Potter - C:Harry:1:1:1

然而,我想要达到的结果是:

Harry Potter - A:JK:1:1:1
Harry Potter - B:JK:1:1:1

任何帮助?

3 个答案:

答案 0 :(得分:2)

awk -F ':' '{print $0}'所做的就是打印每一行,它在你的例子中什么都不做。

如果您想使用awk执行此操作,则会:

$ awk -F: '$1~/Harry/' file
Harry Potter - A:JK:1:1:1
Harry Potter - B:JK:1:1:1

# Case insensitive 
$ awk -F: 'tolower($1)~/harry/' file
Harry Potter - A:JK:1:1:1
Harry Potter - B:JK:1:1:1

如果第一个字段$1/Harry/匹配,则仅打印该行,不区分大小写的版本将第一个字段转换为所有小写字符并检查/harry/

如果您知道总是如此,您可以将harry锚定到^行的开头?

$ grep -i "^harry" file
Harry Potter - A:JK:1:1:1
Harry Potter - B:JK:1:1:1

答案 1 :(得分:0)

所以你希望它只在第一次出现“:”分隔符之前在行的第一部分上进行grep?

假设您确定文件中没有“%”: 1)用未使用的字符(%或另一个)替换“:”的第一个(也是第一个)出现,并在%

之前显示你的字符串。
sed -e 's/:/%/' < BookDB.txt | grep -i '^[^%]*harry[^%]*%'

或者如果所有行都包含“ - ”:简化它:

sed -e 's/:/%/' < BookDB.txt | grep -i '^[^%]*harry'

并添加到此

| sed -e 's/%/:/' # to restore the original line

在上面,您可以将“:”替换为“ - ”(多字符分隔符),它仍然有效。

如果你真的需要在单个角色出现之前找到一些东西,你可以进一步简化(但不太灵活):

grep -i '^[^:]*harry[^:]*:'

grep -i '^[^:]*harry'

(第二个应该只在所有行的格式与你需要匹配的格式相似时才使用)

答案 2 :(得分:-2)

如果您只是在第一个参数中查找Harry,则下面的命令将执行此操作

grep -i "harry " BookDB.txt | awk -F ':' '{print $0}'

但是,如果您需要完整的图书名称,则必须编写一个bash脚本,该脚本将提取图书名称并将其与您的输入进行比较。