M
이 질문의 변형은 여러 곳에서 여러 번 요청되었을 것입니다. 그러나 파일에서 마지막 몇 줄을 제거하려고 시도했지만 운이 없었습니다.
이것두 번째로 가장 많이 투표된 답변존재하다이 문제파일의 마지막 줄을 삭제하려면 다음을 수행하는 것이 좋습니다.
head -n -1 foo.txt > temp.txt
그러나 OSX와 Zsh에서 시도하면 다음과 같은 결과를 얻습니다.
head: illegal line count -- -1
왜 그런 겁니까? 어떻게 삭제해?M
마지막철사그리고이것첫 번째 N
주어진 파일의 줄?
답변1
다음 명령을 사용하여 처음 12줄을 삭제할 수 있습니다.
tail -n +13
(즉, 13번째 줄 부터 인쇄가 시작됩니다 .)
head
GNU에서 지원하는 일부 구현은 다음과 같습니다 head
.
head -n -12
그러나 이것은 표준이 아닙니다.
tail -r file | tail -n +13 | tail -r
tail -r
GNU도 있지만 tac
최적이 아닌 시스템에서 실행될 수 있습니다 .
n
1 여기서:
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