머리/꼬리에 대한 부정 인수

머리/꼬리에 대한 부정 인수

M이 질문의 변형은 여러 곳에서 여러 번 요청되었을 것입니다. 그러나 파일에서 마지막 몇 줄을 제거하려고 시도했지만 운이 없었습니다.

이것두 번째로 가장 많이 투표된 답변존재하다이 문제파일의 마지막 줄을 삭제하려면 다음을 수행하는 것이 좋습니다.

head -n -1 foo.txt > temp.txt

그러나 OSX와 Zsh에서 시도하면 다음과 같은 결과를 얻습니다.

head: illegal line count -- -1

왜 그런 겁니까? 어떻게 삭제해?M 마지막철사그리고이것첫 번째 N주어진 파일의 줄?

답변1

다음 명령을 사용하여 처음 12줄을 삭제할 수 있습니다.

tail -n +13

(즉, 13번째 부터 인쇄가 시작됩니다 .)

headGNU에서 지원하는 일부 구현은 다음과 같습니다 head.

head -n -12

그러나 이것은 표준이 아닙니다.

tail -r file | tail -n +13 | tail -r

tail -rGNU도 있지만 tac최적이 아닌 시스템에서 실행될 수 있습니다 .

n1 여기서:

sed '$d' file

다음과 같이 할 수도 있습니다.

sed '$d' file | sed '$d'

2개 행을 삭제하지만 이것이 최선의 옵션은 아닙니다.

넌 할 수있어:

sed -ne :1  -e 'N;1,12b1' -e 'P;D'

그러나 이것은 더 큰 값에는 작동하지 않습니다.N일부 sed구현으로.

그리고 awk:

awk -v n=12 'NR>n{print line[NR%n]};{line[NR%n]=$0}'

m처음과 n끝에서 줄을 제거하려면:

awk -v m=6 -v n=12 'NR<=m{next};NR>n+m{print line[NR%n]};{line[NR%n]=$0}'

답변2

다음 방법을 사용하여 처음 N 행과 마지막 M 행을 삭제할 수 있습니다.

N=5, M=7및 파일 사용 test.txt:

sed -n -e "6,$(($(wc -l < test.txt) - 7))p" test.txt

이 명령은 N+1부터 LastLine-M까지 모든 행을 인쇄합니다.

또 다른 옵션은 Python을 사용하는 것입니다.

python -c 'import sys;print "".join(sys.stdin.readlines()[5:-7]),' < test.txt

아나콘다 3:

python -c 'import sys;print("".join(sys.stdin.readlines()[5:-7]))' < test.txt

기존 파일을 덮어쓰려면:

python -c 'import sys;print("".join(sys.stdin.readlines()[5:-7]))' < test.txt > temp.txt && mv temp.txt test.txt

답변3

M다음을 사용하여 파일에서 마지막 줄(여기서는 M=100)을 제거할 수 있습니다.

head -$(($(wc -l < foo.txt) - 100)) foo.txt > temp.txt

관련 정보