파일에서 가장 긴 줄을 인쇄하는 방법은 무엇입니까?

파일에서 가장 긴 줄을 인쇄하는 방법은 무엇입니까?

파일에서 가장 긴 줄을 인쇄하는 가장 간단한 방법을 찾고 있습니다. 인터넷 검색을 좀 했는데 놀랍게도 답을 찾을 수 없는 것 같습니다. 파일에서 가장 긴 줄의 길이를 인쇄하는 경우가 많지만 실제로 가장 긴 줄을 인쇄하는 방법을 모르겠습니다. 파일에서 가장 긴 줄을 인쇄하는 솔루션을 제공할 수 있는 사람이 있나요? 미리 감사드립니다.

답변1

cat ./text | awk ' { if ( length > x ) { x = length; y = $0 } }END{ print y }'

UPD: 댓글의 모든 제안을 요약합니다.

awk 'length > max_length { max_length = length; longest_line = $0 } END { print longest_line }' ./text 

답변2

cat filename | awk '{ print length }' | sort -n | tail -1

답변3

첫 번째로 가장 긴 줄을 그렙하세요.

grep -Em1 "^.{$(wc -L <file.txt)}\$" file.txt 

이 명령은 셸 구문과 정규식 구문이 혼합되어 있기 때문에 연습 없이는 읽기가 어렵습니다.
설명하기 위해 먼저 단순화된 의사 코드를 사용하겠습니다. 로 시작하는 줄은 ##셸에서 실행되지 않습니다.
이 단순화된 코드는 파일 이름 F를 사용하고 가독성을 높이기 위해 따옴표와 정규 표현식의 일부를 생략합니다.

어떻게 작동하나요?

명령은 grep-와 wc호출의 두 부분으로 구성됩니다.

## grep "^.{$( wc -L F )}$" F

wc프로세스 확장에 사용되므로 이전 $( ... )에 실행됩니다 grep. 가장 긴 선의 길이를 계산합니다. 셸 확장 구문은 혼란스러운 방식으로 정규식 패턴 구문과 혼합되어 있으므로 프로세스 확장을 분석하겠습니다.

## wc -L F
42
## grep "^.{42}$" F

여기서 프로세스 확장은 반환할 값으로 대체되어 grep사용되는 명령줄이 생성됩니다. 이제 정규식을 더 쉽게 읽을 수 있습니다. ^행의 시작( )부터 끝( )까지 정확하게 일치합니다. $이들 사이의 표현식은 42번 반복되는 개행 문자를 제외한 모든 문자와 일치합니다. 결합하면 42자 라인이 됩니다.


이제 실제 쉘 명령으로 돌아가서 grep옵션 -E( --extended-regexp)을 사용하면 {}가독성을 높이기 위해 이스케이프를 허용합니다. 옵션 -m 1( --max-count=1)을 사용하면 첫 번째 줄을 찾은 후 중지합니다. 명령은 파일을 표준 입력에 <기록하여 파일 이름과 길이가 인쇄되지 않도록 합니다.wcwc

어느 줄이 가장 긴가요?

파일 이름이 두 번 나타나는 경우 예제를 더 읽기 쉽게 만들기 위해 예제의 각 f파일 이름을 파일 이름으로 바꿀 수 있는 변수를 사용합니다.$f

f="file.txt"

보여주다첫 번째 긴 줄- 첫 번째 줄은 가장 긴 줄만큼 깁니다.

grep -E -m1 "^.{$(wc -L <"$f")}\$" "$f"

전시하다모든 긴 줄- 가장 긴 줄만큼 긴 모든 줄:

grep -E "^.{$(wc -L <"$f")}\$" "$f" 

보여주다마지막 줄이 가장 길다- 마지막 줄은 가장 긴 줄만큼 깁니다.

tac "$f" | grep -E -m1 "^.{$(wc -L <"$f")}\$"

보여주다단일 가장 긴 줄- 가장 긴 줄은 다른 모든 줄보다 길며, 그렇지 않으면 실패합니다.

[ $(grep -E "^.{$(wc -L <"$f")}\$" "$f" | wc -l) = 1 ] && grep -E "^.{$(wc -L <"$f")}\$" "$f" 

(마지막 명령은 전체 grep 명령을 반복하기 때문에 다른 명령보다 효율성이 떨어집니다. 출력 wc과 작성된 줄이 grep변수에 저장되도록 분명히 나누어야 합니다.
참고로 가장 긴 줄은 모두 실제로 저장이 가능합니다. 변수의 위의 모든 행은 처음 두 행만 유지합니다.

답변4

sed -rn "/.{$(<file expand -t1 |wc -L)}/{p;q}" file

이것은 먼저 명령 대체에서 파일을 읽고 가장 긴 줄의 길이를 출력합니다(이전에는 expand극복하기 위해 탭을 공백으로 변환했습니다 wc -L. 줄의 모든 탭이 추가됩니다)1 대신 8줄 길이에 맞춰). 그런 다음 해당 길이는 sed"해당 문자 수를 포함하는 줄을 찾아 인쇄하고 종료"를 의미하는 표현식 에 사용됩니다 . 따라서 가장 긴 줄이 파일 상단 근처에 있기 때문에 이것이 실제로 최적일 수 있습니다. 헤헤(훌륭하고 건설적인 의견에 감사드립니다).

sed보다 이전에 내가 생각한 또 다른 것(bash에서):

#!/bin/bash
while read -r line; do
    (( ${#line} > max )) && max=${#line} && longest="$line"
done
echo "$longest"

관련 정보