Как отобразить всю строку текста?

Пример моей информации:

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 

Мой код отобразит только предполагаемый поиск, поэтому, если вы закроете «Apple», он отобразит только «Красное яблоко» и «Зеленое яблоко», но не количество, как заставить его отображать всю информацию. То же, что и количество, если вы наберете «20», отобразится только «20».

Ваш cut эффективно удаляет информацию, которую вы ищете, из ввода, который вы подаете, в grep . Используйте только

 grep "^[^,]*$fruit[^,]*" information.txt 

вместо

 cut -d\, -f1 information.txt | grep $fruit 

а также

 grep "^[^,]*,$quantity$" information.txt 

вместо

 cut -d\, -f2 information.txt | grep $quantity 

для фильтрации интересующих вас строк. regexp:

  • ^ начинает сопоставление в начале строки;

  • [^,]* соответствует любой строке, не содержащей запятой ( , );

  • $fruit соответствует строке, содержащейся в переменной среды fruit ;

  • другой [^,]* должен быть очевиден в этой точке.

Как только вы добавите больше полей в свои данные, вам может потребоваться изменить регулярные выражения – в этом случае любой учебник по этим пригодится, синтаксис находится на странице man 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 см. выше;

  • сортирует и удаляет дубликаты ( -u );

  • join объединяет строки со стандартного ввода (рядом с последним аргументом) с содержимым файла, указанного в качестве последнего аргумента. Он использует запятую как разделитель полей ( -t, ) и соединяет строки, первые поля которых идентичны ( -j 1 ).

Требование о том, чтобы отсортированные данные поступали из join (по крайней мере, в пакете coreutils) – я не проверял, как большие проблемы могут возникнуть с несортированными данными.