[unix] 유닉스의 텍스트 파일에서 미리 정해진 범위의 줄을 어떻게 추출 할 수 있습니까?

여러 데이터베이스 가치가있는 ~ 23000 행 SQL 덤프가 있습니다. 이 파일의 특정 섹션 (예 : 단일 데이터베이스의 데이터)을 추출하여 새 파일에 배치해야합니다. 원하는 데이터의 시작 및 끝 줄 번호를 모두 알고 있습니다.

16224와 16482 사이의 파일에서 모든 줄을 추출하여 새 파일로 리디렉션하는 유닉스 명령 (또는 일련의 명령)을 아는 사람이 있습니까?



답변

sed -n '16224,16482p;16483q' filename > newfile

로부터 나오지 매뉴얼 :

p- 패턴 공간을 인쇄합니다 (표준 출력으로). 이 명령은 일반적으로 -n 명령 줄 옵션과 함께 사용해야합니다.

n- 자동 인쇄가 비활성화되지 않은 경우 패턴 공간을 인쇄 한 다음 패턴 공간을 다음 입력 라인으로 교체하십시오. 더 이상 입력이 없으면 더 이상 명령을 처리하지 않고 sed가 종료됩니다.

q-sed 더 이상의 명령이나 입력을 처리하지 않고 종료 합니다. -n 옵션으로 자동 인쇄를 비활성화하지 않으면 현재 패턴 공간이 인쇄됩니다.

sed 스크립트의 주소는 다음 형식 중 하나 일 수 있습니다.

number
번호를 지정하면 입력에서 해당 줄만 일치합니다.

주소 범위는 쉼표 (,)로 구분 된 두 주소를 지정하여 지정할 수 있습니다. 주소 범위는 첫 번째 주소가 일치하는 위치부터 시작하여 두 번째 주소가 일치 할 때까지 계속됩니다.


답변

sed -n '16224,16482 p' orig-data-file > new-file

여기서 16224,16482는 시작 줄 번호와 끝 줄 번호입니다. 이것은 1 인덱스입니다. -n입력을 출력으로 에코하는 것을 억제합니다. 숫자는 다음 명령이 작동하게하는 라인 범위를 나타냅니다. 명령 p은 관련 행을 인쇄합니다.


답변

머리 / 꼬리를 사용하여 매우 간단합니다.

head -16482 in.sql | tail -258 > out.sql

sed를 사용하여 :

sed -n '16482,16482p' in.sql > out.sql

awk 사용 :

awk 'NR>=10&&NR<=20' in.sql > out.sql


답변

‘vi’를 사용하고 다음 명령을 사용할 수 있습니다.

:16224,16482w!/tmp/some-file

또는

cat file | head -n 16482 | tail -n 258

편집 :-설명을 추가하기 위해 head -n 16482 를 사용 하여 첫 16482 줄을 표시 한 다음 tail -n 258 을 사용 하여 첫 번째 출력에서 ​​마지막 258 줄을 가져옵니다.


답변

다른 접근 방식이 있습니다 awk.

awk 'NR==16224, NR==16482' file

파일이 크면 exit마지막으로 원하는 행을 읽은 후 좋을 수 있습니다 . 이렇게하면 불필요하게 다음 줄을 읽지 않습니다.

awk 'NR==16224, NR==16482-1; NR==16482 {print; exit}' file

awk 'NR==16224, NR==16482; NR==16482 {exit}' file


답변

perl -ne 'print if 16224..16482' file.txt > new_file.txt


답변

 # print section of file based on line numbers
 sed -n '16224 ,16482p'               # method 1
 sed '16224,16482!d'                 # method 2