grep/awk를 사용하여 텍스트 파일의 특정 값 찾기/인쇄

grep/awk를 사용하여 텍스트 파일의 특정 값 찾기/인쇄

다음 5줄이 포함된 텍스트 파일이 있다고 가정해 보겠습니다.

Tue 18 2022 car model: Toyota , car motor: 2001 , car color: blue , year of production: 2018
Thu 19 2022 car model: Mercedes , car color: black , year of production: 2012 , car motor: 4000
Thu 20 2022 used: yes , car motor: 1999 , car model: Mercedes , car color: black , year of production: 2012
Thu 20 2022 car model: Kia , car motor: 1500 , car color: red , used: no , year of production: 2010
Thu 20 2022 price: 150, car model: GMC  , car color: purple , car motor: 3500 , year of production: 2010

다음 조건이 TRUE로 평가되는 모든 줄을 찾아 인쇄하는 grep/awk(또는 freebsd 11에서 사용 가능한 기타 유틸리티)를 찾고 있습니다.

Phrase "car motor:" followed by a space and then a numerical value greater than 2000

이러한 grep/awk는 텍스트 파일에서 다음 줄을 찾거나 인쇄할 것으로 예상됩니다.

Tue 18 2022 car model: Toyota , car motor: 2001 , car color: blue , year of production: 2018
Thu 19 2022 car model: Mercedes , car color: black , year of production: 2012 , car motor: 4000
Thu 20 2022 price: 150, car model: GMC  , car color: purple , car motor: 3500 , year of production: 2010

답변1

Perl은 freebsd에서 사용할 수 있으며 귀하의 요구 사항은 직접 번역될 수 있다고 생각합니다.

perl -ne 'print if /car motor: (\d+)/ and $1 > 2000' file

답변2

match()에 대한 세 번째 인수를 일치시키려면 GNU awk를 사용하십시오.

$ awk 'match($0,/car motor: ([0-9]+)/,a) && (a[1] > 2000)' file
Tue 18 2022 car model: Toyota , car motor: 2001 , car color: blue , year of production: 2018
Thu 19 2022 car model: Mercedes , car color: black , year of production: 2012 , car motor: 4000
Thu 20 2022 price: 150, car model: GMC  , car color: purple , car motor: 3500 , year of production: 2010

또는 awk를 사용하십시오.

$ awk 'match($0,/car motor: [0-9]+/) && (substr($0,RSTART+11) > 2000)' file
Tue 18 2022 car model: Toyota , car motor: 2001 , car color: blue , year of production: 2018
Thu 19 2022 car model: Mercedes , car color: black , year of production: 2012 , car motor: 4000
Thu 20 2022 price: 150, car model: GMC  , car color: purple , car motor: 3500 , year of production: 2010

또는 awk를 사용할 수도 있지만 좀 더 난해합니다.

$ awk '{k=$0} sub(/.*car motor: /,"",k) && (k > 2000)' file
Tue 18 2022 car model: Toyota , car motor: 2001 , car color: blue , year of production: 2018
Thu 19 2022 car model: Mercedes , car color: black , year of production: 2012 , car motor: 4000
Thu 20 2022 price: 150, car model: GMC  , car color: purple , car motor: 3500 , year of production: 2010

답변3

2000자신을 제외하려면 숫자 값이 아닌 문자열로 처리하는 많은 조합이 필요합니다 .

grep -E 'car motor: (200[1-9]|20[1-9][0-9]|2[1-9][0-9]{2}|[3-9][0-9]{3}|[1-9][0-9]{4,})' yourfile

답변4

사용행복하다(이전 Perl_6)

raku -ne '.put if m/car \s motor \: \s (\d**4..*)/ && $0 > 2000;' 

또는

raku -ne '.put if .grep(/car \s motor \: \s (\d**4..*)/ && {$0 > 2000});' 

입력 예(@schrodigerscatcuriosity 덕분에):

Tue 18 2022 car model: Toyota , car motor: 2001 , car color: blue , year of production: 2018
Thu 19 2022 car model: Mercedes , car color: black , year of production: 2012 , car motor: 4000
Thu 20 2022 used: yes , car motor: 1999 , car model: Mercedes , car color: black , year of production: 2012
Thu 20 2022 car model: Kia , car motor: 1500 , car color: red , used: no , year of production: 2010
Thu 20 2022 price: 150, car model: GMC  , car color: purple , car motor: 3500 , year of production: 2010

car motor: 1
car motor: 100
car motor: 1000
car motor: 2000
car motor: 2001
car motor: 4000
car motor: 9999
car motor: 10000

출력 예(위의 코드 예 사용):

Tue 18 2022 car model: Toyota , car motor: 2001 , car color: blue , year of production: 2018
Thu 19 2022 car model: Mercedes , car color: black , year of production: 2012 , car motor: 4000
Thu 20 2022 price: 150, car model: GMC  , car color: purple , car motor: 3500 , year of production: 2010
car motor: 2001
car motor: 4000
car motor: 9999
car motor: 10000

그것은 다음과 같습니다행복하다아래 권장 사항에 따라(소스에서) Rakudo 컴파일러를 설치한 경우 FreeBSD와 함께 작동합니다.

https://rakudo.org/downloads/rakudo/source
https://fluca1978.github.io/2020/01/14/RakuOnFreeBSD.html

Rakudo-Star 바이너리(Rakudo와 핵심 모듈)가 FreeBSD에서 사용 가능한 것처럼 보입니다.

https://www.tyil.nl/post/2020/06/21/lately-in-raku/

간단히 말해서 Raku의 일치 연산자를 사용한 첫 번째 예는 m/.../@glenn_jackman의 Perl 코드를 거의 직접 번역한 것입니다. "백슬래시" 경험을 줄이려면 다음과 같이 작성할 수 있습니다.

raku -ne '.put if m[ "car motor: " (\d**4..*) ] && $0 > 2000;'   

두 번째 예에서는 Raku grep연산자를 사용합니다. 일치하는 행을 반환하고 일치하지 않는 행을 비워 두는 것이 더 나은 경우도 있습니다. Raku에서는 grep다음과 같이 이 작업을 수행할 수 있습니다 (모든 줄에 번호를 매김).

raku -ne 'put(++$, ". ", .grep: / "car motor: " (\d**4..*)/ && {$0 > 2000} );' 

예제 출력:

1. Tue 18 2022 car model: Toyota , car motor: 2001 , car color: blue , year of production: 2018
2. Thu 19 2022 car model: Mercedes , car color: black , year of production: 2012 , car motor: 4000
3. 
4. 
5. Thu 20 2022 price: 150, car model: GMC  , car color: purple , car motor: 3500 , year of production: 2010
6. 
7. 
8. 
9. 
10. 
11. car motor: 2001
12. car motor: 4000
13. car motor: 9999
14. car motor: 10000

https://raku.org

관련 정보