답변:
AWK 솔루션
awk '{
if (length($0) > 5)
print $0;'} yourfile
또는 더 간결하게 :
awk 'length > 5' file
awk 'length > 5'
awk
는 다소 덜 우아하지만 간결하다awk '/^.{6,}/'
awk '/.{6}/'
(실제로 GNU awk는 최근까지 POSIXLY_CORRECT를 환경에 전달하지 않으면 작동하지 않는 것으로 나타났습니다).
배쉬 솔루션
#!/bin/bash
count=0
while read; do
((++count))
len=${#REPLY}
if ((len > 80)); then
echo "Line $count is $len characters."
fi
done
예를 들어 ./whatever.sh < input.file
. $len
; 에서 1을 빼서 개행을 포함하지 않습니다 . 바람직하지 않거나 입력에서 CRLF 엔딩을 사용하는 경우 적절하게 조정해야합니다.
${#line}
를 피하지 expr
않습니까?
bash
솔루션의 경우 +1 그러나 IFS=
앞에 삽입 하지 않으면 read
선행 공백이 무시됩니다.
$line
필요하지 않습니다.
read
읽을 이름을 지정 하지 않으면 REPLY
모든 공백을 읽고 포함합니다. 어떤 IFS
설정이 필요하지 않습니다.
while read
텍스트를 처리하는 루프는 실제로 나쁜 습관입니다.
또 다른 bash 솔루션 (bash 4)이 있습니다.
minlen=5 # minimum length of a line
mapfile -tO1 < inputfile # Map the file to the array MAPFILE (by default)
# Start the array at index 1
for i in "${!MAPFILE[@]}"; do
(( ${#MAPFILE[i]} > minlen )) || unset MAPFILE[i] # Remove shorter elements
done
결과 배열은 희소하므로 배열 인덱스가 유지됩니다. 우리가 1에서 시작한 이후, 색인은 우리가 유지 한 줄의 줄 번호입니다. 그 줄 번호 만 출력 할 수 있습니다.
printf 'Long lines found at: '
printf '%d, ' "${!MAPFILE[@]}"
echo
또는 라인 자체를 출력 할 수 있습니다.
printf '%s\n' "${MAPFILE[@]}"
grep
), 줄 번호 또는 다른 것으로 (아마도 다른 작업을 적용하고 싶습니까)? 아마도이 작업을 수행하는 가장 편리한 방법은 다음에이 라인으로 수행 할 작업에 달려 있습니다.