我的信息示例:
Fruit,Quantity:Cost,Sold
Red Apple,10,1,5
Green Apple,10,2,20
Orange,20,1,10
这是我的代码:
if [ "$fruit != $blank" ] && [ "$quantity" == "$blank" ]; then
cut -d\, -f1 information.txt | grep $fruit
elif [ "$quantity != $blank" ] && [ "$fruit" == "$blank" ]; then
cut -d\, -f2 information.txt | grep $quantity
我的代码只会显示想要的搜索,所以如果你输入“苹果”,它只会显示“红苹果”和“青苹果”,但不显示数量,我该如何让它显示所有信息。与数量相同,如果输入“20”,则仅显示“20”。
答案1
您cut
正在有效地从您提供的输入中删除您正在查找的信息grep
。仅使用
grep "^[^,]*$fruit[^,]*" information.txt
代替
cut -d\, -f1 information.txt | grep $fruit
和
grep "^[^,]*,$quantity$" information.txt
代替
cut -d\, -f2 information.txt | grep $quantity
过滤您感兴趣的行。正则表达式:
^
从行首开始匹配;[^,]*
匹配任何不包含逗号 (,
) 的字符串;$fruit
匹配环境变量中包含的字符串fruit
;[^,]*
此时另一个应该是显而易见的。
一旦您将更多字段添加到数据中,您可能需要修改正则表达式 - 在这种情况下,任何有关这些的教程都会派上用场,语法位于grep(1)
手册页中(即使用man grep
:)。
如果您坚持使用cut
并且您的输入已排序,您可以使用以下方式将信息放回join
(对于第一种情况):
inf=information.txt
cut -d, -f1 $inf | grep "$fruit" | sort -u | join -t, -j 1 - $inf
cut
-f1
输出名称包含在环境变量中的文件的第一个字段 ( )inf
,其中字段以逗号 (-d,
) 分隔;grep
往上看;sort
排序并删除重复项 (-u
);join
将标准输入(-
最后一个参数旁边的 in)中的行与作为最后一个参数给出的文件内容连接起来。它使用逗号作为字段分隔符 (-t,
) 并连接第一个字段相同的行 (-j 1
)。
对数据进行排序的要求来自join
(至少是 coreutils 包中的一个) - 我还没有检查未排序的数据可能会遇到多大的问题。