쉘 명령을 사용하여 파일의 처음 n 줄과 마지막 줄을 삭제하는 방법은 무엇입니까?

쉘 명령을 사용하여 파일의 처음 n 줄과 마지막 줄을 삭제하는 방법은 무엇입니까?

이름 이 다음과 같은 파일이 있습니다 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 $를 가져오려고 하면 NEOF가 발생하고 처리가 완전히 중지됩니다. 그러나 패턴 공간에는 모든 라인이 포함되어 있었으며 14,20그 중 어느 것도 P인쇄되지 않았고 인쇄된 적도 없었습니다.
  • 다른 모든 라인에서는 패턴 공간에서 처음으로 나타나는 ewline sed P만 인쇄 하고 새 루프를 시작하기 전에 동일한 내용(또는 다음 6개 입력 라인)을 삭제합니다. 7행은 새 루프에서 ext 명령을 사용하여 스택에 다시 추가됩니다.\nDN

따라서 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

관련 정보