내 정보의 예:
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 패키지에 있는 하나 이상)에서 발생합니다. 정렬되지 않은 데이터가 얼마나 많은 문제가 있는지 확인하지 않았습니다.