如何显示整行文本?

如何显示整行文本?

我的信息示例:

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 包中的一个) - 我还没有检查未排序的数据可能会遇到多大的问题。

相关内容