머리 / 꼬리에 대한 부정적인 주장


14

이 질문의 변형은 확실히 여러 곳에서 여러 번 요청되었지만 M파일에서 마지막 줄을 운없이 제거하려고합니다 .

두 번째 투표 대답이 질문 은 A 파일의 마지막 라인을 제거하기 위해 다음을 수행하는 것이 좋습니다 :

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

그러나 OSX & Zsh에서 시도하면 다음과 같은 결과가 나타납니다.

head: illegal line count -- -1

왜 그런 겁니까? 어떻게 제거 할 수있는 M 마지막 라인 처음 N 주어진 파일의 라인을?



1
출력은 head --version무엇입니까? 어떤 시스템을 사용하고 있습니까?
jofel

@jofel head --version은 실제로 오류를 반환합니다.
Amelio Vazquez-Reina

답변:


20

다음을 사용하여 처음 12 행을 제거 할 수 있습니다.

tail -n +13

(13 번째 줄부터 인쇄하는 것을 의미합니다.)

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

head -n -12

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

tail -r file | tail -n +12 | tail -r

tail -r(GNU도 참조 tac) 있지만 최적이 아닌 시스템에서 작동합니다 .

n1은 어디에 있습니까?

sed '$d' file

당신은 또한 할 수 있습니다 :

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

두 줄을 제거하지만 최적은 아닙니다.

넌 할 수있어:

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}'

sed 'x;1d;$d'마지막 두 줄을 얻는 데 사용될 수도 있습니다. 그리고 N이후 몇 가지를 1d사용하면 그보다 조금 더 많은 것을 얻을 수 있지만 그 시점에서는 N;P;D이미 권장 하는 루프 보다 이점이 없습니다 .
mikeserv

감사합니다-마지막 명령이 매우 유용합니다. 여름 작은주의해야 할 점은 : 그것은 작동하지 않을 때는 않습니다 m또는 n입니다 0. 그렇지 않으면 완벽 할 것입니다.
Amelio Vazquez-Reina

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 -c 'import sys;print "".join(sys.stdin.readlines()[5:-7]),' < test.txt

1

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

head -$(($(wc -l < foo.txt) - 100)) foo.txt > temp.txt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.