텍스트 파일에서 특정 줄을 가져 오려고합니다.
지금까지 온라인에서는 sed와 같은 것만 본 적이 있습니다. (저는 sh-bash 나 sed 또는 이와 비슷한 것을 사용할 수 없습니다). 기본 셸 스크립트 만 사용하여이 작업을 수행해야합니다.
cat file | while read line
do
#do something
done
위와 같이 줄을 반복하는 방법을 알고 있지만 특정 줄의 내용 만 가져와야하는 경우
답변
sed :
sed '5!d' file
awk :
awk 'NR==5' file
답변
line
필요한 줄 번호를 보유하는 변수 라고 가정하면 head
and 를 사용할 수 있다면 tail
매우 간단합니다.
head -n $line file | tail -1
그렇지 않은 경우 작동합니다.
x=0
want=5
cat lines | while read line; do
x=$(( x+1 ))
if [ $x -eq "$want" ]; then
echo $line
break
fi
done
답변
사용할 수 있습니다 sed -n 5p file
.
범위 (예 : sed -n 5,10p file
.
답변
최고의 성능 방법
sed '5q;d' file
sed
5 번째 줄 이후에는 어떤 줄도 읽지 않기 때문에
Roger Dueck 씨의 업데이트 실험
나는 wcanadian-insane (6.6MB)을 설치하고 time 명령을 사용하여 sed -n 1p / usr / share / dict / words와 sed ‘1q; d’/ usr / share / dict / words를 비교했습니다. 첫 번째는 0.043 초, 두 번째는 0.002 초 였으므로 ‘q’를 사용하는 것은 확실히 성능 향상입니다!
답변
예를 들어 파일의 10 ~ 20 행을 얻으려면 다음 두 가지 방법을 각각 사용할 수 있습니다.
head -n 20 york.txt | tail -11
또는
sed -n '10,20p' york.txt
p
위의 명령은 인쇄를 의미합니다.
답변
이런 일을하는 표준 방법은 외부 도구를 사용하는 것입니다. 쉘 스크립트를 작성하는 동안 외부 도구 사용을 허용하지 않는 것은 어리석은 일입니다. 그러나 외부 도구를 사용하고 싶지 않다면 5 행을 다음과 같이 인쇄 할 수 있습니다.
i=0; while read line; do test $((++i)) = 5 && echo "$line"; done < input-file
이것은 논리 줄 5를 인쇄합니다. 즉, input-file
줄 연속이 포함 된 경우 단일 줄로 계산됩니다. -r
읽기 명령 에 추가하여이 동작을 변경할 수 있습니다 . (아마 원하는 동작 일 것입니다.)
답변
William Pursell의 답변 과 병행 하여 원래 v7 Bourne 셸에서도 작동해야하는 간단한 구조가 있습니다 (따라서 Bash를 사용할 수없는 곳도 있음).
i=0
while read line; do
i=`expr "$i" + 1`
case $i in 5) echo "$line"; break;; esac
done <file
break
우리가 찾고 있던 라인을 얻었을 때 루프 외부로 의 최적화도 주목하십시오 .