テキスト ファイル内の 'x' 文字未満の行をすべて削除するにはどうすればよいですか?

テキスト ファイル内の 'x' 文字未満の行をすべて削除するにはどうすればよいですか?

テキスト ファイル内の文字数または数字または記号が '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///Ss

注 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を実行する

関連情報