다음 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