이름 이 다음과 같은 파일이 있습니다 Element_query
.
SQL> select count (*) from element;
[Output of the query which I want to keep in my file]
SQL> spool off;
쉘 명령을 사용하여 첫 번째 줄과 마지막 줄을 삭제하고 싶습니다.
답변1
GNU 사용 sed
:
sed -i '1d;$d' Element_query
작동 방식:
-i
파일 자체를 편집하는 옵션. 원하는 경우 옵션을 제거하고 출력을 새 파일이나 다른 명령으로 리디렉션할 수도 있습니다.1d
첫 번째 행 삭제(1
첫 번째 행에만 영향을 미치므로d
삭제)$d
마지막 행 삭제($
마지막 행에만 적용,d
삭제)
한 단계 더 나아가세요:
- 범위를 삭제할 수도 있습니다. 예를 들어
1,5d
처음 5개 행을 삭제합니다. SQL>
using 문으로 시작하는 모든 줄을 제거할 수도 있습니다./^SQL> /d
- 모든 빈 줄을 제거할 수 있습니다.
/^$/d
- 마지막으로,
statement1;statement2;satement3;...
세미콜론( )으로 구분하거나 명령줄에서 개별적으로 지정( )하여-e 'statement1' -e 'statement 2' ...
모든 명령문을 결합 할 수 있습니다.
답변2
머리;
{ head -n[num] >/dev/null
head -n[num]
} <infile >outfile
위와 같이 첫 번째 명령의 출력 헤더에서 제거할 첫 번째 줄 수 head
와 쓸 줄 수를 지정할 수 있습니다.outfile
두 번째로. 또한 일반적 sed
으로 다음보다 빠릅니다. 특히 입력이 다음과 같은 경우에는 더욱 그렇습니다.큰-두 번의 통화가 필요합니다. 어디 sed
확실하게~해야 한다<infile
그러나 이 경우에는 바람직하다.아니요정규,검색 가능파일 - 일반적으로 그렇듯이아니요이 경우 예상대로 작동하지만 sed
모든 출력 수정 사항은 단일 스크립트 프로세스에서 처리될 수 있습니다.
GNU의 경우 부정적인 형식을 head
사용할 수 있습니다-
[num]
두 번째 명령에서도 마찬가지입니다. 이 경우 다음 명령은 입력에서 첫 번째 줄과 마지막 줄을 제거합니다.
{ head -n1 >/dev/null
head -n-1
} <infile >outfile
또는 POSIX를 사용하십시오 sed
.
예를 들어, 20줄의 입력을 읽고 있는데 처음 3줄과 마지막 7줄을 삭제하고 싶습니다. 내가 이 작업을 수행하기로 결정했다면 sed
테일 버퍼를 사용하여 수행할 것입니다. 먼저 3개와 7개를 더해 총 10개를 만든 후 다음을 수행합니다.
seq 20 | sed -ne:n -e '3d;N;1,10bn' -eP\;D
다음은 입력에서 처음 3줄과 마지막 7줄을 제거하는 예입니다. 아이디어는 원하는 만큼 많은 라인을 버퍼링하여 스택의 패턴 공간에서 입력의 꼬리를 제거하고 P
끌어오는 각 라인에 대해 첫 번째 라인만 인쇄하는 것입니다.
- Onlines는
1,10
sed
P
각 라인에 대해 패턴 공간의 입력을 한 줄씩 목초지 루프에 쌓기 때문에 아무것도 인쇄하지 않습니다b
. - 3번째 줄에서는 모든
sed
스택이d
제거됩니다. 따라서 처음 3개 줄은 출력에서 한 번에 제거됩니다. sed
입력의 마지막 줄 에 도달하여 ext$
를 가져오려고 하면N
EOF가 발생하고 처리가 완전히 중지됩니다. 그러나 패턴 공간에는 모든 라인이 포함되어 있었으며14,20
그 중 어느 것도P
인쇄되지 않았고 인쇄된 적도 없었습니다.- 다른 모든 라인에서는 패턴 공간에서 처음으로 나타나는 ewline
sed
P
만 인쇄 하고 새 루프를 시작하기 전에 동일한 내용(또는 다음 6개 입력 라인)을 삭제합니다. 7행은 새 루프에서 ext 명령을 사용하여 스택에 다시 추가됩니다.\n
D
N
따라서 seq
출력은(이것은 연속된 번호가 매겨진 20개의 라인입니다), sed
그냥 인쇄하세요:
4
5
6
7
8
9
10
11
12
13
입력의 꼬리에서 제거하려는 줄 수가 많을 때 문제가 될 수 있습니다. sed
`의 성능은 패턴 공간의 크기에 정비례하기 때문입니다. 그럼에도 불구하고 이는 많은 경우에 실행 가능한 솔루션이며 POSIX는 sed
충돌이 발생하기 전에 최소 4kb를 처리할 수 있는 패턴 공간을 지정합니다.
답변3
다음 해결 방법을 시도해 보세요.
tail -n +2 name_of_file | head -n-1
맞춤화
처음 n개 행을 제거하도록 쉽게 수정할 수 있습니다 +2
.tail
;
또는 마지막 n 줄 -1
의 변경 사항을 삭제합니다.head
.
답변4
범위 사이에서 행을 선택할 수 있습니다 awk
(행 개수를 알고 있다고 가정).
awk 'NR>1 && NR < 3' file
또는 Perl에서는:
perl -ne 'print if $.>1 && $.<3' file
행 수를 모르는 경우 다음 명령을 사용하여 즉석에서 계산할 수 있습니다. grep
(이 방법은 빈 행을 계산하지 않으며 grep -c '' file
이를 사용하여 빈 행도 계산할 수 있습니다.)
awk -vm="$(grep -c . file2.txt)" 'NR>1 && NR<m' file2.txt