次の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()の3番目の引数を一致させるには、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;'
2 番目の例では Rakugrep
演算子を使用します。一致する行を返し、一致しない行を空白のままにする方が良い場合があります。 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