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()の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

https://raku.org

関連情報