[linux] 쉘 스크립트 만 사용하여 텍스트 파일에서 특정 줄 가져 오기

텍스트 파일에서 특정 줄을 가져 오려고합니다.

지금까지 온라인에서는 sed와 같은 것만 본 적이 있습니다. (저는 sh-bash 나 sed 또는 이와 비슷한 것을 사용할 수 없습니다). 기본 셸 스크립트 만 사용하여이 작업을 수행해야합니다.

cat file | while read line
    do
       #do something
    done

위와 같이 줄을 반복하는 방법을 알고 있지만 특정 줄의 내용 만 가져와야하는 경우



답변

sed :

sed '5!d' file

awk :

awk 'NR==5' file


답변

line필요한 줄 번호를 보유하는 변수 라고 가정하면 headand 를 사용할 수 있다면 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

sed5 번째 줄 이후에는 어떤 줄도 읽지 않기 때문에

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우리가 찾고 있던 라인을 얻었을 때 루프 외부로 의 최적화도 주목하십시오 .