特定の長さを超えるファイル内の行を識別する方法


12

コード内で特定の長さを超える行を見つけたいのですが。私のコードは複数のファイルにあります。これを行う良い方法は何ですか?

ファイルと行番号を知りたい。コンテンツが優先されますが、必須ではありません。演習の目的は、(おそらく手動で)行を分割する方法を理解することです。


どのように結果が欲しいですか?行自体(のようなコンテンツ)として、grepまたは行番号として、または何か他のものとして(おそらく、それらに別のアクションを適用したい)おそらくこれを行う最も便利な方法は、次にこれらの行で何が行われるかに依存します。
imz-イヴァンザカリヤシェフ14年

@ imz--IvanZakharyaschev良い点。質問が更新されました。
マルチン

回答:


13

grep

grep -En '.{12}' file

12文字以上の行の場合。

いくつかのファイルで:

find . -type f -exec grep -En '.{12}' {} +

grepGNUのような一部の実装grepは、ファイル検索を自分で行うことができます。

grep -rEn '.{12}' .

ただし、シンボリックリンクやその他の非正規ファイルには注意してください。


私はこれがシンプルだから気に入っています。そして、私はこのようなことをしたいと思っていました(まだやっていない)。
マーシン14年

12

AWKソリューション

awk '{       
if (length($0) > 5)
        print $0;'} yourfile

または、より簡潔に:

awk 'length > 5' file

9
私たちはあなたのバージョン短縮することができますawk 'length > 5'
cuonglm

グヌークはブレースキラーです;)
Ouki 14年

1
+1awk 'length > 5'

3
GNUとawkやや少ないエレガントなく、簡潔なawk '/^.{6,}/'
iruvar

3
@ 1_CR、これはPOSIXであり、短くすることができますawk '/.{6}/'(実際には、GNU awkは、POSIXLY_CORRECTを環境に渡さない限り機能しないものでした)。
ステファンシャゼル14年


5

Bashソリューション

#!/bin/bash

count=0

while read; do
    ((++count)) 
    len=${#REPLY}
    if ((len > 80)); then
        echo "Line $count is $len characters."
    fi
done

だから、例えば、./whatever.sh < input.file。これには、から1を引いた改行は含まれません$len。それが望ましくない場合、または入力でCRLFの末尾を使用する場合は、それに応じて調整する必要があります。


1
なぜフォーク${#line}を避けないのexprですか?
iruvar 14年

1
ハハ、純粋なbashソリューションの場合は+1 。ただしIFS=、の前に固執しない限りread、先頭のスペースは無視されることに注意してください。
iruvar

1
いくつかのbashのグッドプラクティスに追加されました。また、改行は取り込まれ$lineないため、1を引く必要はありません。
iruvar

2
@ 1_CRは、実際readに読み込む名前を指定しなかった場合REPLY、すべての空白文字を読み込んで含めます。IFS設定は必要ありません。
小次郎14年

2
これは非常に遅くなり、バックスラッシュ文字を特別に処理します。while readテキストを処理するループは本当に悪い習慣です。
ステファンシャゼル14年

4

perl長い80文字を超える行を探しているあなたを仮定して、(例えば):

行を表示するには:

$ perl -nle 'print if length > 80' your_file

行番号を表示するには:

$ perl -nle 'print "$.\n" if length > 80' your_file

または両方:

$ perl -nle 'print "[$.]:  $_\n" if length > 80' your_file

3
-lコマンドラインを追加する必要perlがあります。行の改行をカウントします。
cuonglm 14年

1

ルビー:

ruby -lne 'puts $_ if $_.size > 5' intputfile

Python

python -c "import sys;[ sys.stdout.write(''.join(line)) for line in sys.stdin if len(line.strip()) > 5 ]" < inputfile

1

別のbashソリューション(bash 4)を次に示します。

minlen=5 # minimum length of a line
mapfile -tO1 < inputfile # Map the file to the array MAPFILE (by default)
                         # Start the array at index 1
for i in "${!MAPFILE[@]}"; do
  (( ${#MAPFILE[i]} > minlen )) || unset MAPFILE[i] # Remove shorter elements
done

結果の配列はまばらなので、配列のインデックスは維持されます。1から開始したため、インデックスは保持した行の行番号です。これらの行番号のみを出力できます。

printf 'Long lines found at: '
printf '%d, ' "${!MAPFILE[@]}"
echo

または、行自体を出力できます。

printf '%s\n' "${MAPFILE[@]}"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.