파일에서 가장 긴 줄을 얻는 방법?


10

파일에서 가장 긴 줄의 줄 번호를 찾고 싶습니다.

예를 들어 다음과 같은 내용의 파일이있는 경우 :

lalala
tatatata
abracadabra
mu mu mu

어떻게 bash 스크립트를 작성하여 다음과 같은 출력을 줄 수 3 -> abracadabra있습니까?

답변:


9

이를 위해 스크립트가 필요하지 않습니다. 간단한 명령으로 충분합니다.

egrep -n "^.{$(wc -L < filename)}$" filename

최대 길이가 같은 줄이 두 개 이상인 경우에도 작동합니다.

출력이 다음 형식으로 정확하게 표시되도록 3 -> abracadabra하려면 다음을 사용하십시오.

egrep -n "^.{$(wc -L < filename)}$" filename | sed 's/:/ -> /'

참고 문헌 :


3
@ don.joey : 그것은 유닉스의 힘입니다. 함께 사용할 수있는 간단한 명령. 여기서 그는 "^. {n} $", 즉 줄의 시작 ( ^)과 끝 ( $) 사이에 정확히 n 개의 문자 ( .{n}) 가 있는 모든 줄을 찾습니다 . 그런 다음 그는 단지 n을 찾아야합니다.이를 위해서는 GNU-ism 인 "wc -L filename"(이는 posix가 아님)을 사용하여 가장 긴 파일 이름 행의 길이를 반환합니다. 그래서 그는 가장 긴 길이의 라인을 잡습니다. $(cmd)의 출력으로 대체됩니다 cmd.
Olivier Dulac

1
@OlivierDulac 좋은 의견.
Radu Rădeanu

또한 -C 3grep 옵션에 예를 들어 컨텍스트 전후에 몇 줄을 추가 할 수도 있습니다
ShadSterling

8

당신이 사용할 수있는 awk각 라인 (길이 인쇄 length())과 줄 번호 ( NR), 다음 (역 -r) sort(번호로 결과를 -n)

$ awk '{ print length(), NR, $0 | "sort -rn" }' tmp.txt
10 3 abracadabr
8 4 mu mu mu
7 2 tatatat
6 1 lalala

첫 번째 줄만 표시하려면

$ awk '{ print length(), NR, $0 | "sort -rn" }' tmp.txt | head -n 1
10 3 abracadabr

@ user214965 내 업데이트를 참조하십시오. 표시된 행 번호는 결과에서 두 번째 숫자입니다.
Attila O.

최대 길이가 같은 두 줄이 있으면 어떻게됩니까?
Radu Rădeanu

@ RaduRădeanu 좋은 지적. 에 +1하여 wc -L해당 주장에 대해 몰랐습니다. 실제로 매우 유용합니다.
Attila O.

4

AOL (N)은 perl one liner로 달성 할 수 있습니다.

perl -e 'while (<>) { if (length > length $max) { $max=$_}}; print $max'

사용법 (여기서 machin은 파일 이름)

cat machin | perl -e 'while (<>) { if (length > length $max) { $max=$_}}; print $max'

또는

perl -e 'while (<>) { if (length > length $max) { $max=$_}}; print $max' machin

또는 (명확하지만 짧음)

perl -ne 'if(length>length$m){$m=$_};END{print$m}' machin

훨씬 더 효율적입니다. 감사! 그것을 찾고 있었다.
test30

1
거대한 파일 +1에서 작동
h3xStream 3:29의

0

O (n) Perl을 사용할 수없는 OpenWRT와 같은 기계의 경우 @ awk @ 버전이 유용 할 수 있습니다.

awk 'length > l {l=length;line=$0} END {print line}' FILE

또는 파이썬 :

python -c "print max(open('$file', 'r'), key=len)"

0

Radu의 대답은 완벽하고 충분하지만 선호합니다.보다 명시적이고 쉘 기반 솔루션을 원한다면 다음 스크립트를 사용할 수 있습니다.

#!/bin/bash
longest_length=0
longest_string=0
while IFS= read -r line || [ -n "${line}"]
do
    if [ "${#line}" -gt "${longest_length}" ]
    then
        longest_length="${#line}"
        longest_string="$line"
    fi
done < "$1"

echo "${longest_string}"

용법: ./find_longest.sh input.txt

예:

$ cat input.txt                                                          
1 2 
2 3 a a a a
4 5 6 
1 1 1 5

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