Bash에서 파일의 마지막 줄 제거


Answers

이것은 특히 가장 큰 파일에서 가장 빠르고 간단한 솔루션입니다 :

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

상위 행을 삭제하려면 다음을 사용하십시오.

tail -n +2 foo.txt

이는 라인 2에서 시작하는 출력 라인을 의미합니다.

파일의 상단이나 하단에서 줄을 지우는 데 sed 를 사용하지 마십시오. 파일이 클 경우에는 매우 느립니다.

Question

다음 줄을 포함하는 foo.txt 파일이 있습니다.

a
b
c

나는 foo.txt 의 내용을 얻는 간단한 명령을 원한다.

a
b



이 두 가지 솔루션은 다른 형태로 제공됩니다. 나는 이것들이 조금 더 실용적이고 명확하고 유용하다는 것을 발견했다.

dd 사용 :

BADLINESCOUNT=1
ORIGINALFILE=/tmp/whatever
dd if=${ORIGINALFILE} of=${ORIGINALFILE}.tmp status=none bs=1 count=$(printf "$(stat --format=%s ${ORIGINALFILE}) - $(tail -n${BADLINESCOUNT} ${ORIGINALFILE} | wc -c)\n" | bc )
/bin/mv -f ${ORIGINALFILE}.tmp ${ORIGINALFILE}

truncate 사용 :

BADLINESCOUNT=1
ORIGINALFILE=/tmp/whatever
truncate -s $(printf "$(stat --format=%s ${ORIGINALFILE}) - $(tail -n${BADLINESCOUNT} ${ORIGINALFILE} | wc -c)\n" | bc ) ${ORIGINALFILE}



awk 'NR>1{print buf}{buf = $0}'

기본적으로이 코드는 다음과 같이 말합니다.

첫 번째 줄 이후의 각 줄에 대해 버퍼링 된 줄을 인쇄하십시오.

각 줄마다 버퍼를 재설정하십시오.

버퍼가 한 줄 씩 뒤떨어져 있으므로 1 행에서 n-1 행까지 인쇄됩니다.




echo -e '$d\nw\nq'| ed foo.txt



전체 파일을 읽지 않거나 아무것도 다시 쓰지 않고 마지막 줄을 파일에서 제거하려면 다음을 사용할 수 있습니다.

tail -n 1 "$file" | wc -c | xargs -I {} truncate "$file" -s -{}

마지막 줄을 제거하고 stdout ( "pop"it)에 인쇄하려면, 다음 명령을 tee 와 결합 할 수 있습니다.

tail -n 1 "$file" | tee >(wc -c | xargs -I {} truncate "$file" -s -{})

이 명령은 매우 큰 파일을 효율적으로 처리 할 수 ​​있습니다. 이것은 Yossi의 답과 비슷하지만, 몇 가지 추가 기능을 사용하지 않습니다.

이러한 작업을 반복적으로 사용하고 오류 처리 및 기타 기능을 원할 경우 여기에서 poptail 명령을 사용할 수 있습니다. https://github.com/donm/evenmoreutils




Related