テキスト ファイル内の文字数または数字または記号が 'x' 未満の行をすべて削除するにはどうすればよいですか? awk 'length($0)>'
スペースが含まれるため、使用できません。
答え1
n
グラフィカル シンボルが 1 個未満の行を削除するとします。
awk -v n=5 '{ line = $0; gsub("[^[:graph:]]", "") } length >= n { print line }'
これにより、 に一致しないすべての文字が削除されます[[:graph:]]
。残った文字列の長さが 以上の場合はn
、(変更されていない) 行が印刷されます。
の値はn
コマンド ラインで指定されます。
[[:graph:]]
は と同等であり[[:alnum:][:punct:]]
、 も同様です[[:alpha:][:digit:][:punct:]]
。 は とほぼ同じです[[:print:]]
が、スペースには一致しません。
の代わりに、 を使用してすべてのタブまたはスペースを削除すること[^[:graph:]]
もできます。[[:blank:]]
ではsed
、上記のawk
コードをほぼ文字通りに実行すると、
sed -e 'h; s/[^[:graph:]]//g' \
-e '/.\{5\}/!d; g'
または、簡略化して(空白以外の文字のみを数える)、
sed -e 'h; s/[[:blank:]]//g' \
-e '/...../!d; g'
これはまず、 を使用して現在の行をホールド スペースに保存しますh
。次に、 を使用して行にあるすべての非グラフ文字 (または 2 番目のバリエーションの空白文字) を削除しますs///g
。行に含まれる文字数が 5 未満の場合 (この数値を任意の数値に変更するか、2 番目のバリエーションのドットの数を変更します)、行は削除されます。それ以外の場合は、 を使用して保存された行をホールド スペースから取得しg
、 (暗黙的に) 印刷します。
答え2
sed -e 's/[^[:space:][:cntrl:]]/&/20' -e t -e d < file
file
は、少なくとも 20 個の非空白文字および非制御文字を含むの行を出力します( または[[:graph:]]
も参照してください[[:alnum:][:punct:]]
。説明にどの文字を含めるか/除外するかは明確ではありません。一部のシステムでは、非改行スペース文字は には含まれますgraph
が には含まれないことに注意してくださいspace
)。
アイデアとしては、20 番目の非空白/制御文字をそれ自体で置き換えようとし ( &
)、その置き換えが成功したら分岐し ( t
)、d
アクション (削除) をスキップするというものです。
を使用するとawk
、次の操作を実行できます。
awk 'gsub(/[^[:space:][:cntrl:]]/, "&") >= 20' < file
gsub()
行われた置換の数を返すという事実に依存します。
とgrep
:
grep -E '^([[:space:][:cntrl:]]*[^[:space:][:cntrl:]]){20}' < file
((.*[^[:space:][:cntrl:]]){20}
これも機能しますが、より高価になります)。
答え3
これにより、10 文字以下の行が削除されます。
sed -E '/^.{1,11}$/d' filename
または
sed -r '/^.{1,11}$/d' filename
スペースをトリミングしたい場合は、以下を使用できます。
sed -E 's/^[[:space:]]*//g;s/[[:space:]]*$//g;/^.{1,11}$/d' filename
インプレース(ファイル内で直接)削除したい場合は、-私オプションも付いています。
答え4
Raku (旧称 Perl6) の使用
raku -ne '.put if chars( S:g/\s// ) >= 10;' filename
または
raku -ne '.put unless chars( S:g/\s// ) < 10;' filename
または
raku -ne '.put unless chars( S:g/\W// ) < 10;' filename
または
raku -ne '.put unless chars( S:g/<ws>// ) < 10;' filename
簡単に言うと、Raku/Perl6 では、「大文字の S」S///
演算子を使用して、不要な文字 (空白など) のない結果の文字列を生成し、結果の文字列の文字を関数でカウントしてchars
、「n」(例として 10 を使用) と比較し、最後にブール値が満たされた場合、.put
元の行をそのまま返します。
注1: 「S/// は s/// 演算子と同じセマンティクスを使用しますが、元の文字列をそのまま残し、$/ の代わりに結果の文字列を返します ($/ は s/// の場合と同じ値に設定されます)。」
https://docs.raku.org/language/regexes#S///_非破壊的置換
注 2: Raku/Perl6 正規表現では、('global' の) のような修飾子は副詞と呼ばれ、(通常は) or演算子:g
の先頭、 or の直後に配置されます。S///
s///
S
s
注 3: .
Raku/Perl6 のドットはトピック変数 のメソッドを呼び出すために使用される$_
ため、コードの最初の「単語」.put
は基本的に の省略形になります$_.put
。
https://docs.raku.org/language/5to6-nutshell#-%3E_Method_calls
注 4: Raku/Perl6 には、はるかに制限されたコマンド ライン フラグのセットがあります。-e
フラグ ("execute") は、コマンド ラインで Raku/Perl6 コードを実行します。フラグ-n
は、Raku/Perl6 コードを行単位で実行します。つまり、入力ファイルの各行に対して 1 行ずつ実行し、結果を返します。2 つのフラグを組み合わせて 1 つの-ne
フラグにすることもできますが、いずれにしても、-e
フラグは最後に指定する必要があります。
Perl_6 リンク:
https://docs.raku.org/language/5to6-nutshell#コマンドラインフラグ
https://github.com/rakudo/rakudo/wiki/コマンドラインからrakudoを実行する