저는 일반적인 UNIX 명령을 사용하는 쉘 스크립트를 작성하고 있습니다. 공백 포함) 문자가 가장 적은 줄을 검색해야 합니다. 최대 20줄까지 가능합니다.
head -$L | tail -1 | wc -m
L 줄을 찾는 데 사용할 수 있는 문자 수를 알고 있습니다 . 문제는 내가 생각할 수 있는 유일한 방법은 값을 비교하는 여러 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
인쇄하십시오 .ab
cd