어떻게 추출할 수 있는 소정의 범위를 줄이는 텍스트 파일에서 유닉스에서?

StackOverflow https://stackoverflow.com/questions/83329

문제

I have a~23000line SQL 덤프를 포함하는 여러 데이터베이스의 데이터가 있습니다.나를 추출하는 데 필요한 특정 섹션의 이 파일을(즉에 대한 데이터는 단일 데이터베이스)및 그것에 새로운 파일입니다.나는 모두 알고 있는 시작과 끝 라인의 숫자는 데이터 제가 원하는 것입니다.

사람이 알고 있는 유닉스령(또는 일련의 명령)추출하려면 모든 라인에서 파일 사이 말하는 라인 16224 및 16482 및 리디렉션 다음으로 새로운 파일입니까?

도움이 되었습니까?

해결책

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

sed 설명서:

p - 본을 프린트 공간을(표준출력).이 명령은 일반적으로만과 함께 사용-n 명령행 옵션입니다.

n - 는 경우 자동 인쇄되지 않은 장애인,패턴을 인쇄 공간을,그 다음에 관계없이,대체 패턴 공간으로 다음의 라인 입력이 있습니다.는 경우 이 더 이상 없을 입력한 다음 나오지 않고 종료 처리 더 이상 명령입니다.

q - 구 sed 처리하지 않고 더 이상 명령 또는 입력입니다.현재 패턴 공간을 인쇄하는 경우 자동 인쇄를 사용하지 않는 것으로-n 옵션입니다.

주소에서 나오는 스크립트할 수 있는 다음과 같은 형태:

번호 을 지정하여 라인 번호만 일치하는 라인에서의 입력이 있습니다.

주소 범위를 지정할 수 있습을 지정하여 두 주소 로 구분하여 쉼표(,)입니다.주소의 범위와 일치하 라인에서 시작 첫 번째 주 일까지 계속 두 번째 주소 일(포함).

다른 팁

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

편집:-단지 추가 설명,사용 머리-n16482 를 표시하는 첫 번째 16482 선을 다음 사용 tail-n258 마지막으로 얻을 258 라인의 첫 번째 출력됩니다.

또 다른 방법으로 awk:

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

일 경우는 거대하다,그것은에게 좋은 수 있습니다 exit 을 읽은 후에 마지막으로 원하는 선이다.이 방법은,그것을 읽지 않습니다 다음과 같은 줄을 불필요:

awk 'NR==16224, NR==16482-1; NR==16482 {print; 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

sed -n '16224,16482p' < dump.sql

cat dump.txt | head -16224 | tail -258

해야 합니다.이 방법의 단점은 이해야 하는 연산을 수행하고 결정하는 인수에 대한 꼬리 및 위해 계정할지 여부는'사을 포함한 끝 라인 또는하지 않습니다.

빠르고 더러운:

head -16428 < file.in | tail -259 > file.out

아마 그것을 할 수있는 가장 좋은 방법은 하지만 작업해야 합니다.

BTW:259=16482-16224+1 입니다.

내가 쓴 메 라는 프로그램 splitter 는지 정확히 이:가 읽기를 통해 출시 블로그에 포스트.

프로그램을 사용할 수 있습니다 다음과 같다:

$ cat somefile | splitter 16224-16482

고 그 모든 것이 거기에 있습니다.당신이 필요일하고 설치합니다.그냥:

$ cabal install splitter

당신은 할 수 있습니다.나는 희망을 찾을 수 있는 이 프로그램에 유용합니다.

심지어는 우리가 이것을 할 수 있을 확인에 명령 라인:

cat filename|sed 'n1,n2!d' > abc.txt

예를 들어:

cat foo.pl|sed '100,200!d' > abc.txt

를 사용하여 루비:

ruby -ne 'puts "#{$.}: #{$_}" if $. >= 32613500 && $. <= 32614500' < GND.rdf > GND.extract.rdf

의 어깨에 서 boxxar,나는 다음과 같다:

sed -n '<first line>,$p;<last line>q' input

예:

sed -n '16224,$p;16482q' input

$ 의"마지막 줄은"그래서 첫 번째 명령은 sed 모든 인쇄 라인을 시작으로 라인 16224 그리고 두 번째 명령은 sed 종료 후에 라인 인쇄 16428.(추가 1q범위에 boxxar 의 솔루션을 것 같지 않 필요합니다.)

나는 다음과 같이 변형을 하지 않기 때문에 나는 지정할 필요가 끝나는 선수다.나는 측정을 사용하는 것 $ 하지 않는 해로운 영향에서 성과입니다.

나는에 대해이었을 게시하는 머리/꼬리를 속이지만,실제로 나는 아마 그냥 불 emacs.;-)

  1. esc-x goto-line ret 16224
  2. 표시(ctrl-공간)
  3. esc-x goto-line ret 16482
  4. esc-w

를 열고 새로운 출력 파일,ctl-y 저장

자 나에게 무슨 일을 참조하십시오.

나는 사용:

awk 'FNR >= 16224 && FNR <= 16482' my_file > extracted.txt

FNR 포함코(라)번호 라는 파일에서 읽.

내가 쓴 작은 bash 스크립트를 실행할 수 있는 명령행에서,그래서 당신 업데이트하는 경로를 포함하는 해당 디렉터리(또는 배치할 수 있는 디렉토리에는 이미 이 경로에 포함).

사용법:$핀치 파일을 시작-라인 엔드라인

#!/bin/bash
# Display line number ranges of a file to the terminal.
# Usage: $ pinch filename start-line end-line
# By Evan J. Coon

FILENAME=$1
START=$2
END=$3

ERROR="[PINCH ERROR]"

# Check that the number of arguments is 3
if [ $# -lt 3 ]; then
    echo "$ERROR Need three arguments: Filename Start-line End-line"
    exit 1
fi

# Check that the file exists.
if [ ! -f "$FILENAME" ]; then
    echo -e "$ERROR File does not exist. \n\t$FILENAME"
    exit 1
fi

# Check that start-line is not greater than end-line
if [ "$START" -gt "$END" ]; then
    echo -e "$ERROR Start line is greater than End line."
    exit 1
fi

# Check that start-line is positive.
if [ "$START" -lt 0 ]; then
    echo -e "$ERROR Start line is less than 0."
    exit 1
fi

# Check that end-line is positive.
if [ "$END" -lt 0 ]; then
    echo -e "$ERROR End line is less than 0."
    exit 1
fi

NUMOFLINES=$(wc -l < "$FILENAME")

# Check that end-line is not greater than the number of lines in the file.
if [ "$END" -gt "$NUMOFLINES" ]; then
    echo -e "$ERROR End line is greater than number of lines in file."
    exit 1
fi

# The distance from the end of the file to end-line
ENDDIFF=$(( NUMOFLINES - END ))

# For larger files, this will run more quickly. If the distance from the
# end of the file to the end-line is less than the distance from the
# start of the file to the start-line, then start pinching from the
# bottom as opposed to the top.
if [ "$START" -lt "$ENDDIFF" ]; then
    < "$FILENAME" head -n $END | tail -n +$START
else
    < "$FILENAME" tail -n +$START | head -n $(( END-START+1 ))
fi

# Success
exit 0

이 당신을 위해 일할 수 있습니다(GNU sed):

sed -ne '16224,16482w newfile' -e '16482q' file

또는 이용 bash:

sed -n $'16224,16482w newfile\n16482q' file

내가 하고 싶은 같은 일에서 스크립트를 사용하여 변수 달성에 의해 그것을 따옴표를 넣어 주$변수 별도로 변수 이름에서 p:

sed -n "$first","$count"p imagelist.txt >"$imageblock"

내가 원하는 분할 목록 별도의 폴더에 발견 초기 질문과 답변한 유용한 단계입니다.(분할할 명령지에서 옵션을 올드 os 내 항구하는 코드).

-N 에 동의 답 작동합니다.여기에는 다른 방법이 경우에 당신은 경사했습니다.

cat $filename | sed "${linenum}p;d";

이는 다음과 같은 작업을 수행합니다.

  1. 파이프의 내용이 파일(또는 공급에 텍스트 그러나 당신이 원한다면).
  2. sed 선택된 라인,인쇄합니다
  3. d 를 삭제하는 데 필요한 라인,그렇지 않으면 sed 다고 가정한 모든 라인은 결국 인쇄할 수 있습니다.지 않고 즉,d,당신은 모든 것을 얻을 것이다 라인 인쇄하여 선택한 라인 인쇄된 두 가지고 있기 때문에 당신은${linenum}p 부분을 요청은 그것을 인쇄할 수 있습니다.나는 확-n 기본적으로 동일한 것으로 여기에.

때문에 우리가 얘기하는 추출 라인에서 텍스트의 텍스트 파일로 저는 특별한 경우를 추출하려는 모든 라인과 일치하는 특정 패턴이 있습니다.

myfile content:
=====================
line1 not needed
line2 also discarded
[Data]
first data line
second data line
=====================
sed -n '/Data/,$p' myfile

인쇄[Data]라인이 남아있습니다.당신이 원하는 텍스트에서 1 호선하는 패턴을,당신은 종류:sed-n'1/Data/p'myfile.또한,당신이 알고 있는 경우 두 개의 패턴(더 나은야에서 고유한 텍스트),두 시작과 끝 라인의 범위를 지정할 수 있습니다.

sed -n '/BEGIN_MARK/,/END_MARK/p' myfile

나는 생각이 유용할 수 있는 솔루션입니다.테이블이 있는 경우 이름은"사람"사용할 수 있습 sed 해 모든 라인을 복원해야 합니다.

sed -n -e '/DROP TABLE IF EXISTS.*`person `/,/UNLOCK TABLES/p' data.sql  > new_data.sql

에 따라 이 답변, 그것은"드롭 테이블의 경우에는"존재하는 테이블에 대한 복원하고 있는 당신을 삭제해야 몇 줄의 바닥에서 새로운 파일을 사용하기 전에 그것을 방지하는 삭제입니다 수 있습니다.

자세한 정보도 찾을 수 있습니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top