답변:
이를 위해 스크립트가 필요하지 않습니다. 간단한 명령으로 충분합니다.
egrep -n "^.{$(wc -L < filename)}$" filename
최대 길이가 같은 줄이 두 개 이상인 경우에도 작동합니다.
출력이 다음 형식으로 정확하게 표시되도록 3 -> abracadabra하려면 다음을 사용하십시오.
egrep -n "^.{$(wc -L < filename)}$" filename | sed 's/:/ -> /'
참고 문헌 :
-C 3grep 옵션에 예를 들어 컨텍스트 전후에 몇 줄을 추가 할 수도 있습니다
당신이 사용할 수있는 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
wc -L해당 주장에 대해 몰랐습니다. 실제로 매우 유용합니다.
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
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
^)과 끝 ($) 사이에 정확히 n 개의 문자 (.{n}) 가 있는 모든 줄을 찾습니다 . 그런 다음 그는 단지 n을 찾아야합니다.이를 위해서는 GNU-ism 인 "wc -L filename"(이는 posix가 아님)을 사용하여 가장 긴 파일 이름 행의 길이를 반환합니다. 그래서 그는 가장 긴 길이의 라인을 잡습니다.$(cmd)의 출력으로 대체됩니다cmd.