파일에서 가장 긴 줄


198

파일에서 가장 긴 줄의 길이를 찾는 간단한 방법을 찾고 있습니다. 이상적으로는 스크립트 대신 간단한 bash 쉘 명령입니다.

답변:


270

wc (GNU coreutils) 사용 7.4 :

wc -L filename

제공합니다 :

101 filename

56
참고 만하는 것이 -c -l -m -w옵션은 POSIX입니다. -LGNUism입니다.
Jens

4
또한 결과 -L는 로캘 에 따라 다릅니다. 일부 문자 (바이트 및 멀티 바이트 의미)는 전혀 계산되지 않을 수 있습니다!
Walter Tross

7
OS X :wc: illegal option -- L usage: wc [-clmw] [file ...]
휴고

12
OS X : homebrew를 사용하여 GNU Word Count에 gwc 사용 gwc -L filename
kaycoder

3
@xaxxon gwccoreutils모든 GNU coreutils를 g접두사로 설치 하는 공식 입니다.
gsnedders

100
awk '{print length, $0}' Input_file |sort -nr|head -1

참조 : 파일에서 가장 긴 줄 찾기


12
왜 여분의 고양이 명령? 파일 이름을 awk에 대한 인수로 직접 지정하십시오.
Thomas Padron-McCarthy

18
@도마. 파일을 옵션으로 지정하는 것보다 파이프로 표현하는 것이 더 일반적입니다. 필자의 경우 데이터베이스 쿼리에서 파이프 된 출력을 사용합니다.
Andrew Prock가

1
더 POSIX (물론, OS X에 작품) 때문에이 사람은 가장 좋은 대답입니다
MK.

5
@MK. 그러나,이 접근법은 라인 수에서 O (n * log (n)) 인 반면, 라몬의 접근법은 O (n)입니다.
jub0bs

2
큰 파일을 정렬하는 데는 입력 파일 크기에 따라 테라 바이트의 임시 공간까지 기가 바이트를 완료하고 소비하는 데 몇 시간이 걸릴 수 있습니다. 가장 긴 길이와 관련 레코드를 저장 한 다음 END{}블록 에서 인쇄 해보십시오 .
Luv2code

67
awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }'  YOURFILE 

3
awk '{ if (length($0) > max) max = length($0) } END { print max }' YOURFILE
ke20

5
awk 'length>max{max=length}END{print max}' file
Chris Seymour

8
이 대답은 파일에서 길이가 아닌 가장 긴 줄 의 텍스트 를 제공합니다 . 제목을 보고이 페이지를 방문하는 사람들에게 유용 할 것이라고 생각하기 때문에 질문에 길이가 필요한 경우에도 그대로 둡니다.
라몬

3
WC.를 사용하여 수를 쉽게 얻을 수 있습니다.awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }' YOURFILE | wc -c
Nick

1
이것이 어떻게 작동하는지 설명해 주시겠습니까?
Lnux

23

고양이를 쓸모없고 외부 명령을 사용하지 않고 재미 있고 교육적인 목적으로 순수한 POSIX 셸 솔루션 . 파일 이름을 첫 번째 인수로 사용합니다.

#!/bin/sh

MAX=0 IFS=
while read -r line; do
  if [ ${#line} -gt $MAX ]; then MAX=${#line}; fi
done < "$1"
printf "$MAX\n"

6
(고양이를 통해) std에서 읽을 수 없다면 실제로 이것의 유용성을 줄이고 향상시키지 않습니다.
앤드류 Prock

4
OP는 명시 적으로 "파일"이라고 말 < "$1"했으며 stdin에서 쉽게 읽을 수 있습니다. 테스트를 통해 $#인수 수에 따라 두 가지를 모두 수행 할 수도 있습니다. 이 세상에는 쓸모없는 고양이가 필요하지 않습니다. 초보자는 처음부터 올바르게 가르쳐야합니다.
Jens

7
이것은 사용자가 요청한 것보다 높은 등급이어야합니다. 가장 긴 함수 추가 () {MAX = 0 IFS = 읽는 동안 -r line; [$ {# line} -gt $ MAX]; MAX = $ {# line}; fi done echo $ MAX}를 .bashrc에 전송하면 다음을 실행할 수 있습니다longest < /usr/share/dict/words
skierpage

13
wc -L < filename

준다

101

1
고마워, 나는 wc파일 이름을 출력 하지 못하게하는 방법을 찾고있다 :)
Peter.O

11
perl -ne 'print length()."  line $.  $_"' myfile | sort -nr | head -n 1

가장 긴 줄의 길이, 줄 번호 및 내용을 인쇄합니다

perl -ne 'print length()."  line $.  $_"' myfile | sort -n

줄 번호와 길이를 가진 모든 줄의 정렬 된 목록을 인쇄합니다

.연결 연산자이다 - 길이는 () 이후 여기에 사용하면
$., 현재의 행 번호는
$_현재 라인


파일 정렬이 필요합니다 .. 중간 크기의 파일에서도 성능이 저하되며 더 큰 파일에서는 작동하지 않습니다. wc -L지금까지 내가 본 최고의 솔루션입니다.
Tagar

반면 소스 (영국 국립 코퍼스)와 같은 5백50메가바이트 6,000,000 줄 텍스트 파일을 사용하여, 펄 솔루션은 12 초 걸렸습니다 wc -L삼초했다
크리스 Koknat을

wc -L숫자 레코드를 세십시오-이 Q는 가장 긴 줄 을 찾으려고했습니다 . 정확하지는 않으므로 정확한 비교는 아닙니다.
Tagar

6

위의 예에서 중요한 간과 점.

다음 2 개의 예제는 확장 탭을 계산합니다.

  wc -L  <"${SourceFile}" 
# or
  expand --tabs=8 "${SourceFile}" | awk '{ if (length($0) > max) {max = length($0)} } END { print max }'

다음 두 개의 확장되지 않은 탭이 계산됩니다.

  expand --tabs=1 "${SourceFile}" | wc -L 
# or
  awk '{ if (length($0) > max) {max = length($0)} } END { print max }' "${SourceFile}"

그래서

              Expanded    nonexpanded
$'nn\tnn'       10            5

5

모든 대답이 가장 긴 줄의 줄 번호를 제공하지 않습니다. 다음 명령은 줄 번호와 대략적인 길이를 줄 수 있습니다.

$ cat -n test.txt | awk '{print "longest_line_number: " $1 " length_with_line_number: " length}' | sort -k4 -nr | head -3
longest_line_number: 3 length_with_line_number: 13
longest_line_number: 4 length_with_line_number: 12
longest_line_number: 2 length_with_line_number: 11

우리는 거기에 갈. 그것은 명백하게 긴 의견을 찾습니다. 고마워 친구.
Philip

한 걸음 더 나아가 고양이를 제거 할 수 있습니다. awk '{print length}' test.txt | sort -rn | head -1. 실제 라인의 내용도 필요하다면 awk '{print length,$0}' test.txt | sort -k1 -rn| head -1
kakoma

3

펄에서 :

perl -ne 'print ($l = $_) if (length > length($l));' filename | tail -1

이것은 길이도 아닌 선만 인쇄합니다.



2

재미있게 여기 Powershell 버전이 있습니다.

cat filename.txt | sort length | select -last 1

그리고 길이를 얻으려면 :

(cat filename.txt | sort length | select -last 1).Length

4
파워 쉘 프로그래머조차도 쓸모없는 고양이를 사용해야합니까?
Jens

1
@Jens 잘 모르겠습니다. Powershell의 cat은 컨텍스트와 공급자에 따라 동작하는 Get-Content의 별칭입니다.
eddiegroves

sortfilename.txt를 인수로 사용할 수 있습니까 ? 그러면 sort length filename.txt | select -last 1파이프와 데이터를 복사하는 프로세스를 피하기 때문에 고양이는 쓸모가 없습니다 .
Jens

부가 적으로 Powershell은 정확히 무엇입니까? Windows 시스템에 powershell 유틸리티가 사용되었다고 생각 했습니까?
franklin

4
@Jens, 데이터는 종종 파일 이름 대신 스트림에서 나옵니다. 이것은 표준 유닉스 도구 관용구입니다.
Andrew Prock

2

나는 유닉스 환경에 있으며 크기가 몇 GB 인 gzipped 파일로 작업합니다. 레코드 길이가 2052 인 2GB gzipped 파일을 사용하여 다음 명령을 테스트했습니다.

  1. zcat <gzipped file> | wc -L

  1. zcat <gzipped file> | awk '{print length}' | sort -u

시간은 평균적이었다

  1. 117 초

  2. 109 초

약 10 회 실행 후 내 스크립트가 있습니다.

START=$(date +%s) ## time of start

zcat $1 |  wc -L

END=$(date +%s) ## time of end
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"

START=$(date +%s) ## time of start

zcat $1 |  awk '{print length}' | sort -u

END=$(date +%s) ## time of end
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"

이것이 유효한 비교인지 확실하지 않습니다 awk. wc버전이 먼저 실행중인 버전 의 디스크 블록 캐싱 (및 디스크 캐시 시드)의 이점 이 있다고 걱정할 것 입니다. 이 논점을 고수하기 위해 10 번의 런을 통해 누가 먼저 부름을 받는지에 대한 순서를 무작위로 만들어야 할 것입니다.
정식 Chris

1

주제에 대한 변형.

이 파일은 파일에서 발견 된 가장 긴 행의 길이를 가진 모든 행을 표시하고 소스에 나타나는 순서를 유지합니다.

FILE=myfile grep `tr -c "\n" "." < $FILE | sort | tail -1` $FILE

그래서 myfile

x
mn
xyz
123
abc

줄게

xyz
123
abc

0

MacOS를 사용 wc: illegal option -- L중이고이 오류가 발생하는 경우 GNU sipmly를 설치할 필요가 없습니다.

파일의 가장 긴 줄에있는 문자의 수를 구하고 OS X run을 사용하는 경우 :

awk '{print length}' "$file_name" | sort -rn | head -1

이 같은;

echo "The longest line in the file $file_name has $(awk '{print length}' "$file_name" | sort -rn | head -1) characters"

출력 :

The longest line in the file my_file has 117 characters

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.