특정 길이의 파일에서 줄을 식별하는 방법


12

내 코드에서 특정 길이를 초과하는 줄을 찾고 싶습니다. 내 코드는 여러 파일에 있습니다. 이것을하는 좋은 방법은 무엇입니까?

파일과 줄 번호를 알고 싶습니다. 내용이 선호되지만 필요하지는 않습니다. 연습의 목적은 줄을 끊는 방법을 알아내는 것입니다 (아마도 수동으로).


결과를 어떻게 원하십니까? 줄 자체 (내용과 같이 grep), 줄 번호 또는 다른 것으로 (아마도 다른 작업을 적용하고 싶습니까)? 아마도이 작업을 수행하는 가장 편리한 방법은 다음에이 라인으로 수행 할 작업에 달려 있습니다.
imz-Ivan Zakharyaschev

@ imz--IvanZakharyaschev 좋은 지적입니다. 질문이 업데이트되었습니다.
Marcin

답변:


13

grep:

grep -En '.{12}' file

12 자 이상인 줄의 경우.

여러 파일로 :

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

grepGNU와 같은 일부 구현 grep은 파일 찾기 자체를 수행 할 수 있습니다.

grep -rEn '.{12}' .

그러나 심볼릭 링크 및 기타 비정규 파일에주의하십시오.


나는 그것이 간단하기 때문에 이것을 좋아하고, 나는 이것과 같은 것을하고 싶었습니다 (아직도 그것에 도달하지 못했습니다).
Marcin

12

AWK 솔루션

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

또는 더 간결하게 :

awk 'length > 5' file

9
우리는 당신의 버전을 단축시킬 수 있습니다awk 'length > 5'
cuonglm

Gnouc는 버팀대 킬러입니다.)
Ouki

1
–1에 대한 +1awk 'length > 5'

3
GNU awk는 다소 덜 우아하지만 간결하다awk '/^.{6,}/'
iruvar

3
@ 1_CR, 그것은 POSIX이며 단축 될 수 있습니다 awk '/.{6}/'(실제로 GNU awk는 최근까지 POSIXLY_CORRECT를 환경에 전달하지 않으면 작동하지 않는 것으로 나타났습니다).
Stéphane Chazelas


5

배쉬 솔루션

#!/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. $len; 에서 1을 빼서 개행을 포함하지 않습니다 . 바람직하지 않거나 입력에서 CRLF 엔딩을 사용하는 경우 적절하게 조정해야합니다.


1
왜 포크 ${#line}를 피하지 expr않습니까?
iruvar

1
ha ha, 순수한 bash솔루션의 경우 +1 그러나 IFS=앞에 삽입 하지 않으면 read선행 공백이 무시됩니다.
iruvar

1
몇 가지 bash 모범 사례에 추가되었습니다. 또한 줄 바꿈이 적용되지 않으므로 줄 바꿈이 $line필요하지 않습니다.
iruvar

2
@ 1_CR 실제로 read읽을 이름을 지정 하지 않으면 REPLY모든 공백을 읽고 포함합니다. 어떤 IFS설정이 필요하지 않습니다.
kojiro

2
그것은 매우 느리고 백 슬래시 문자를 특별히 처리합니다. while read텍스트를 처리하는 루프는 실제로 나쁜 습관입니다.
Stéphane Chazelas

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

1

루비 :

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

파이썬 :

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.