LinuxとUnix環境の両方にこのパターンのファイルがあります。
# file1
text1 98432230
text2 123412
text3 10
line4 0
line5 0
line6 40000
... ...
line10 20
... ...
で終わる行を除外しようとしますが0
、などで終わる行は除外しようとします10
。20
40000
98432230
|grep -v "\0$"
、、、、をテストしましたが、10、20、40000、および98432230を含むゼロで終わる行を除外するため、それらのいずれも機能しませ| grep -v "[[:space:]]0$"
ん。| grep -v " 0"
| sed '/0/d'
| sed "/0$/d"
どんな提案がありますか?
答え1
使用するgrep
代わりにawk
:
$ awk '$NF!=0' file
text1 98432230
text2 123412
text3 10
line6 40000
... ...
line10 20
... ...
のawk
変数NF
sはフィールド数$NF
で、最後のフィールドも同じです。 true と評価される式は「この行印刷」を意味するため、「最後のフィールドがゼロ以外のすべての行$NF!=0
印刷」を意味します。
これをさらに簡素化して、次のこともできます。
awk '$NF' file
答え2
grep の場合、3 つの点、つまり数字以外の文字と行末に「0」が続く正規表現が必要です。
grep -v '[^0-9]0$'
また、2つのゼロで終わるすべての行を一致させて削除しますか00
?
答え3
完全な「単語」と言えるように、ゼロを一致させる必要があります。
grep -vw '0$'
-v
「単語」0で終わる行だけが一致して除外されます。
答え4
使用幸せ(以前のPerl_6)
raku -ne '.put if .grep( none / \D 0 $/ );'
Rakuのルーチンは上記で使用されましたgrep
。正規表現の原子は\D
数字ではありません。このルーチンは、none
正規表現の一致をテストするRakuの結合点を利用します。put
無条件に返すと、if
一致するものがない空の行を含む元のファイルが返されます。
入力例:
text1 98432230
text2 123412
text3 10
line4 0
line5 0
line6 40000
line10 20
出力例:
text1 98432230
text2 123412
text3 10
line6 40000
line10 20
TMTOWTDI:この場合、交換しgrep
て使用すると match
同じ収益が発生します。のmatch(/…/)
ように簡単に書くこともできm/…/
、none
grep/match 演算子の内部は!
以下のように前のものと置き換えることができます。 (洞察力/ディスカッションを提供したBruce Grayに特別な感謝を申し上げます):
raku -ne '.put if .match( none / \D 0 $/ );'
#OR
raku -ne '.put if ! .match( / \D 0 $/ );'
#OR
raku -ne '.put if ! m/ \D 0 $/;'
https://docs.raku.org/routine/none
https://docs.raku.org/routine/grep
https://raku.org