문자 수가 가장 적은 줄을 찾는 방법

문자 수가 가장 적은 줄을 찾는 방법

저는 일반적인 UNIX 명령을 사용하는 쉘 스크립트를 작성하고 있습니다. 공백 포함) 문자가 가장 적은 줄을 검색해야 합니다. 최대 20줄까지 가능합니다.

head -$L | tail -1 | wc -mL 줄을 찾는 데 사용할 수 있는 문자 수를 알고 있습니다 . 문제는 내가 생각할 수 있는 유일한 방법은 값을 비교하는 여러 if 문을 수동으로 작성하는 것입니다.

예시 데이터:

seven/7
4for
8 eight?
five!

4for이 줄에는 문자 수가 가장 적으므로 반환됩니다.

내 경우에는 여러 행의 길이가 가장 짧은 경우 단일 행이 반환되어야 합니다. 최소 길이라면 어느 것을 선택하든 상관없습니다. 그러나 다른 상황에서 다른 사용자에게 두 가지 방법을 모두 보여주는 데 아무런 해가 없다고 생각합니다.

답변1

awk다음은 발견된 첫 번째 가장 작은 행을 인쇄하는 솔루션의 변형입니다.

awk '
  NR==1 || length<len {len=length; line=$0}
  END {print line}
'

조건부 확장을 통해 최소한의 줄을 모두 인쇄할 수 있습니다.

awk '
  length==len {line=line ORS $0}
  NR==1 || length<len {len=length; line=$0}
  END {print line}'
'

답변2

그리고 sqlite3:

sqlite3 <<EOT
CREATE TABLE file(line);
.import "data.txt" file
SELECT line FROM file ORDER BY length(line) LIMIT 1;
EOT

답변3

펄 방식. 길이가 같고 가장 짧은 줄이 여러 개 있는 경우 이 메서드는 그 중 하나만 인쇄합니다.

perl -lne '$m//=$_; $m=$_ if length()<length($m); END{print $m if $.}' file 

설명하다

  • perl -lne: -n"입력 파일을 한 줄씩 읽음"을 의미하며, -l각 입력 줄에서 후행 줄 바꿈을 제거하고 print각 호출에 줄 바꿈을 추가하며 -e각 줄에 적용될 스크립트입니다.
  • $m//=$_: 정의되지 않은 경우 $m현재 행( $_) 으로 설정됩니다. $m//=연산자는 Perl 5.10.0부터 사용할 수 있습니다.
  • $m=$_ if length()<length($m): 현재 값의 길이가 $m현재 줄의 길이보다 길면 $_현재 줄( )을 로 저장합니다 $m.
  • END{print $m if $.}: 모든 라인을 처리한 후 $m가장 짧은 라인의 현재 값을 출력합니다. if $.빈 입력에 대해 빈 줄이 인쇄되는 것을 방지하려면 줄 번호( )를 정의할 때만 이런 일이 발생하는지 확인하세요 .$.

또는 파일이 메모리에 들어갈 만큼 작으므로 다음을 수행할 수 있습니다.

perl -e '@K=sort{length($a) <=> length($b)}<>; print "$K[0]"' file 

설명하다

  • @K=sort{length($a) <=> length($b)}<>: <>요소가 파일의 라인인 배열입니다. 길이에 따라 정렬 되며 sort정렬된 행은 배열로 저장됩니다 @K.
  • print "$K[0]": 배열의 첫 번째 요소 @K(가장 짧은 줄)를 인쇄합니다.

인쇄하고 싶다면모두사용할 수 있는 최단 노선

perl -e '@K=sort{length($a) <=> length($b)}<>; 
         print grep {length($_)==length($K[0])}@K; ' file 

답변4

나는 항상 순수 쉘 스크립트(exec 없음!)를 사용하는 솔루션을 선호했습니다.

#!/bin/bash
min=
is_empty_input="yes"

while IFS= read -r a; do
    if [ -z "$min" -a "$is_empty_input" = "yes" ] || [ "${#a}" -lt "${#min}" ]; then
        min="$a"
    fi
    is_empty_input="no"
done

if [ -n "$a" ]; then
    if [ "$is_empty_input" = "yes" ]; then
        min="$a"
        is_empty_input="no"
    else
        [ "${#a}" -lt "${#min}" ] && min="$a"
    fi
fi

[ "$is_empty_input" = "no" ] && printf '%s\n' "$min"

노트:

입력에 NUL 바이트에 문제가 있습니다. 따라서 대신 printf "ab\0\0\ncd\n" | bash this_script인쇄하십시오 .abcd

관련 정보