Element_query
쿼리 결과를 포함 하는 파일 이 있습니다.
SQL> select count (*) from element;
[Output of the query which I want to keep in my file]
SQL> spool off;
shell 명령을 사용하여 첫 번째 줄과 마지막 줄을 삭제하고 싶습니다.
Element_query
쿼리 결과를 포함 하는 파일 이 있습니다.
SQL> select count (*) from element;
[Output of the query which I want to keep in my file]
SQL> spool off;
shell 명령을 사용하여 첫 번째 줄과 마지막 줄을 삭제하고 싶습니다.
답변:
GNU 사용 sed
:
sed -i '1d;$d' Element_query
작동 방식 :
-i
옵션 파일 자체를 편집하십시오. 해당 옵션을 제거하고 원하는 경우 출력을 새 파일 또는 다른 명령으로 리디렉션 할 수도 있습니다.1d
첫 번째 줄을 삭제합니다 (첫 번째 줄 1
에서만 작동, d
삭제)$d
마지막 줄을 삭제합니다 (마지막 줄 $
에 대해서만 작동 d
하고 삭제)더 나아 가기 :
1,5d
처음 5 줄을 삭제합니다.SQL>
명령문 을 사용하여 시작하는 모든 행을 삭제할 수도 있습니다 ./^SQL> /d
/^$/d
statement1;statement2;satement3;...
)으로 분리하거나 명령 행 ( -e 'statement1' -e 'statement 2' ...
) 에서 별도로 지정 하여 명령문을 결합 할 수 있습니다.1,3d
있지만 (처음 세 줄은 삭제됨 ) 결국에는 조금 더 어려워집니다. 원하는 내용에 따라 다음을 사용하는 것이 좋습니다 . 파일의 위치에 관계없이 sed -i '/^SQL> /d' Element_query
시작하는 행을 삭제 하는 것이 좋습니다 SQL>
.
sed
하나의 라이너 입니다. 파일 의 헤드 와 테일 에서 임의의 줄 수를 제거하는 데 효과적입니다. 입력이 일반 파일 인 한 두 개의 head
프로세스 에서 단일 입력을 그룹화하는 것이 좋습니다. 가장 빠른 방법은 보통입니다.
sed -i '1d' table-backup.sql
SQL 텍스트 파일의 첫 줄을 삭제
{ head -n[num] >/dev/null
head -n[num]
} <infile >outfile
위와 같이 첫 번째 head
명령으로 출력 헤드에서 제거 할 첫 번째 줄 수와 두 번째 명령에 쓸 줄 수를 지정할 수 있습니다 outfile
. 또한 일반적으로 두 번의 호출이 필요하지만 sed
입력이 큰 경우 보다 빠르게 수행합니다 . 어디 sed
확실히 해야 하지만 선호, 경우에 <infile
이다 없는 일반, lseekable 이 일반적으로 때문에 - 파일이 없는 경우 의도지만, 같은 작업 sed
하나의 스크립트 과정에서 모든 출력 수정을 처리 할 수 있습니다.
GNU head
를 사용 하면 두 번째 명령에서도 -
부정적인 형식을 사용할 수 있습니다 [num]
. 이 경우 다음 명령은 입력에서 첫 번째와 마지막 행을 제거합니다.
{ head -n1 >/dev/null
head -n-1
} <infile >outfile
sed
:예를 들어, 20 줄의 입력을 읽었으며 처음 3과 마지막 7을 제거하고 싶다고 말하면 w /으로 해결 sed
하면 꼬리 버퍼로 수행합니다. 먼저 총 스트립 수 10에 3과 7을 더한 다음 다음을 수행합니다.
seq 20 | sed -ne:n -e '3d;N;1,10bn' -eP\;D
입력에서 처음 3 줄과 마지막 7 줄을 제거하는 예제입니다. 아이디어는 스택의 패턴 공간에서 입력의 꼬리에서 제거하려는만큼 많은 행을 버퍼링 할 수 있지만 P
가져온 모든 행에 대해 첫 번째 행만 제거한다는 것입니다.
1,10
sed
P
마다 b
랜치 루프 에서 라인 단위로 패턴 공간에 입력을 쌓기 때문에 라인을 헹구지 않습니다 .sed
스택이 d
제거되므로 첫 세 줄은 한 번의 출력으로 제거됩니다.sed
도달 $
당길 입력 시도 마지막 행 N
내선는 EOF 안타 완전히 처리를 중지. 그러나 그 시간 패턴 공간에 라인이 모두 포함 14,20
-의 어느 것도 아직 한 P
rinted하지 않으며, 결코.sed
P
처음 발생하는 \n
ewline까지만 헹구고 D
남아있는 것 또는 다음 6 라인의 입력으로 새로운 사이클을 시작하기 전에 동일하게 엘레멘트를냅니다. N
새 사이클에서 ext 명령을 사용하여 7 번째 줄이 스택에 다시 추가됩니다 .그래서의 seq
의 출력 (20 개 순차적으로 번호가 매겨진 라인 임) , sed
단지 지문 :
4
5
6
7
8
9
10
11
12
13
입력의 테일에서 제거하고자하는 라인의 수가 클 때 문제가됩니다. 왜냐하면 sed
성능은 패턴 공간의 크기에 정비례하기 때문입니다. 그럼에도 불구하고 많은 경우에 실행 가능한 솔루션입니다. POSIX는 sed
버스 팅 전에 최소 4kb를 처리 할 패턴 공간을 지정합니다.
tail
는 또한 tail -n+<num>
"start from line <num>
"을 의미 하는 확장 된 구문을 지원합니다
여러 줄을 삭제하는 방법에 대해서는 대답하지 않겠습니다. 이런 식으로 문제를 공격 할 것입니다.
grep -v '#SQL>' Element_query >outfile
행 수를 계산하는 대신 프롬프트를 인식하여 SQL 명령을 제거합니다. 이 솔루션은 두 개 이상의 명령으로 더 많은 SQL 세션의 다른 출력 파일에 대해 일반화 할 수 있습니다.
파일에서 선행 및 후행을 제거하는 방법에는 여러 가지가 있습니다.
awk
패턴 매칭과 라인 카운팅을 모두 처리 할 수 있습니다 .
#you need to know length to skip last line, assume we have 100 lines
awk 'NR>1 && NR<100 {print $0};' < inputfile
#or
awk '/SQL/ {next}; {print $0;};' < inputfile |awk 'NR>1&& NR<10 {print $0};'
당신은 사용할 수 있습니다 grep -v
당신이 패턴에 의해 원하지 않는 라인을 제외하고는 사용하여 여러 패턴을 일치시킬 수 있습니다 -E
, 옵션을
grep -v -E "SQL>" < inputfile > outputfile
특정 줄 수를 사용 head
하고 tail
잘라낼 수 있습니다 .
lines=$((`wc -l < inputfile`-2)) #how many lines in file, less 2
head -n-1 < inputfile | head -n$lines > outputfile
#or
tail -n+2 < inputfile | head -n$lines > outputfile
을 사용 vi/vim
하고 첫 번째와 마지막 줄을 삭제할 수 있습니다 .
vi inputfile
:1
dd
:$
dd
:w! outputfile
:x
펄 스크립트를 사용하고, 첫 줄을 건너 뛰고, 각 줄을 저장하고, 다음 줄을받을 때 인쇄 할 수 있습니다.
#left as exercise for the reader :-)
head
실제로 파이프가 필요하지 않으며 실제로 파이프를 피할 수 있으면 파이프를 전혀 사용하지 않는 것이 좋습니다. 당신이 할 때 head | head
- 두 개의 프로세스가 동시에 실행할 수있는 동안, 그들은 또한 둘 다 거의 모든 중복 동일한 데이터의 처리입니다. 대신 { head >dump; head >save; } <in
오프셋으로 만 건너 뜁니다. 첫 번째 줄은 10 줄을 >dump
읽고 두 번째 줄 은 다음 10 줄을 읽습니다 >save
.
SQL 명령 을 잘라 내면 훨씬 더 나은 결과를 얻을 수 있습니다 . 두 가지 방법으로이 작업을 수행 할 수 있습니다.
당신이 경우 절대적으로 확신 순서가 "고 SQL>
"않습니다 하지 출력에 다른 곳에서는 발생
grep -v -F 'SQL> ' < infile > outfile
확실하지 않으면
grep -v '^SQL> .*;$' < infile > outfile
두 번째 버전은 더 느리지 만 더 정확합니다. "SQL>"로 시작하고 세미콜론으로 끝나는 줄은 무시하고,이 줄은 제거하려는 줄을 나타냅니다.
그러나 파일에 추가 출력을 넣지 않는 것이 좋습니다. 대부분의 SQL 시스템에는 몇 가지 방법이 있습니다. 나는 오라클에 너무 익숙하지 않지만 이 답변 이 도움 이 될 수 있습니다.
사용 awk
:
< inputfile awk 'NR>1 {print r}; {r=$0}' > outputfile
< inputfile
:의 내용을 리디렉션 inputfile
에 대한 awk
'들stdin
> outputfile
:의 내용을 재 지정 awk
의 stdout
로를outputfile
NR>1
: 처리중인 레코드 수가 1보다 큰 경우에만 다음 조치를 실행합니다.{print r}
: 변수의 내용을 인쇄합니다 r
{r=$0}
: 처리중인 레코드의 컨텐츠를 변수에 지정합니다. r
따라서 awk
스크립트를 처음 실행할 때 첫 번째 작업 블록이 실행되지 않고 두 번째 작업 블록이 실행되고 레코드의 내용이 변수에 할당됩니다 r
. 두 번째 실행에서 첫 번째 작업 블록이 실행되고 변수의 내용 r
이 인쇄되므로 이전 레코드가 인쇄됩니다. 이것은 처리 된 각 라인을 인쇄하는 효과가 있지만 첫 번째 라인과 마지막 라인을 인쇄합니다.
r
.