Bash의 파일에서 마지막 줄을 제거하십시오.
foo.txt
다음 줄을 포함 하는 파일이 있습니다.
a
b
c
나는 내용이 foo.txt
되는 간단한 명령을 원합니다 .
a
b
사용 GNU sed
:
sed -i '$ d' foo.txt
이 -i
옵션은 GNU sed
3.95 이전 버전 에는 존재하지 않으므로 임시 파일이있는 필터로 사용해야합니다.
cp foo.txt foo.txt.tmp
sed '$ d' foo.txt.tmp > foo.txt
rm -f foo.txt.tmp
물론이 경우 head -n -1
대신 대신 사용할 수도 있습니다 sed
.
맥 OS:
Mac OS X (10.7.4 기준)에서 sed -i
위 의 명령에 해당하는 것은
sed -i '' -e '$ d' foo.txt
이것은 특히 가장 큰 파일에서 가장 빠르고 간단한 솔루션입니다.
head -n -1 foo.txt > temp.txt ; mv temp.txt foo.txt
맨 위 줄을 삭제하려면 다음을 사용하십시오.
tail -n +2 foo.txt
이것은 라인 2에서 시작하는 출력 라인을 의미합니다.
sed
파일의 맨 위나 맨 아래에서 줄을 삭제 하는 데 사용하지 마십시오 . 파일이 크면 매우 느립니다.
HUGE 파일 (~ 300Gb)로 작업하고 솔루션이 확장되지 않았기 때문에 모든 대답에 문제가있었습니다. 내 해결책은 다음과 같습니다.
dd if=/dev/null of=<filename> bs=1 seek=$(echo $(stat --format=%s <filename> ) - $( tail -n1 <filename> | wc -c) | bc )
말로 : 끝내려는 파일의 길이 (을 사용하여 파일 길이에서 마지막 줄 길이의 길이를 뺀 값 bc
)를 찾아 해당 위치를 파일의 끝으로 설정하십시오 ( dd
1 바이트 /dev/null
를 그것).
이것은 tail
끝에서부터 읽기 시작 하기 때문에 빠르며 dd
, 파일의 모든 줄을 복사 (및 파싱)하는 대신 파일 을 덮어 쓰게 되므로 다른 솔루션이하는 것입니다.
참고 : 이렇게하면 파일에서 줄이 제거됩니다. 자신의 파일로 시도하기 전에 더미 파일을 백업하거나 테스트하십시오!
파일에서 마지막 줄을 제거하려면 전체 파일을 읽거나 아무것도 재 작성하지 않고 , 당신은 사용할 수 있습니다
tail -n 1 "$file" | wc -c | xargs -I {} truncate "$file" -s -{}
마지막 행을 제거하고 stdout ( "pop")에 인쇄하려면 해당 명령을 tee
다음 과 결합하면됩니다 .
tail -n 1 "$file" | tee >(wc -c | xargs -I {} truncate "$file" -s -{})
이러한 명령은 매우 큰 파일을 효율적으로 처리 할 수 있습니다. 이것은 Yossi의 답변과 비슷하고 영감을 얻었지만 몇 가지 추가 기능을 사용하지 않습니다.
이것을 반복적으로 사용하고 오류 처리 및 다른 기능을 원한다면 poptail
여기 에서 명령을 사용할 수 있습니다 : https://github.com/donm/evenmoreutils
맥 사용자
파일 자체를 변경하지 않고 마지막 줄에서 삭제 된 출력 만 원한다면
sed -e '$ d' foo.txt
입력 파일 자체의 마지막 줄을 삭제하려면
sed -i '' -e '$ d' foo.txt
Mac 사용자의 경우 :
Mac에서는 head -n -1이 작동하지 않습니다. 그리고 "head"및 / 또는 "tail"명령 만 사용하여이 문제를 해결하기위한 처리 시간에 대한 걱정없이 간단한 해결책을 찾으려고 노력했습니다.
다음과 같은 일련의 명령을 시도했지만 "tail"명령을 사용하여 문제를 해결할 수있어서 기뻤습니다 [Mac에서 사용 가능한 옵션]. 따라서 Mac을 사용 중이고 "꼬리"만 사용하여이 문제를 해결하려는 경우 다음 명령을 사용할 수 있습니다.
고양이 file.txt | 꼬리 -r | 꼬리 -n +2 | 꼬리 -r
설명 :
1> tail -r : 단순히 입력의 라인 순서를 반대로 바꿉니다.
2> tail -n +2 : 입력의 두 번째 줄부터 시작하여 모든 줄을 인쇄합니다.
echo -e '$d\nw\nq'| ed foo.txt
awk 'NR>1{print buf}{buf = $0}'
기본적으로이 코드는 다음과 같이 말합니다.
첫 번째 줄 이후의 각 줄에 대해 버퍼링 된 줄을 인쇄하십시오.
각 줄마다 버퍼를 재설정하십시오.
버퍼는 한 줄씩 지연되므로 라인 1에서 n-1까지 인쇄하게됩니다.
awk "NR != `wc -l < text.file`" text.file |> text.file
이 스 니펫은 트릭을 수행합니다.
이러한 솔루션은 모두 다른 형식으로되어 있습니다. 나는 이것들이 조금 더 실용적이고 명확하며 유용하다는 것을 알았습니다.
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}
자르기 사용 :
BADLINESCOUNT=1
ORIGINALFILE=/tmp/whatever
truncate -s $(printf "$(stat --format=%s ${ORIGINALFILE}) - $(tail -n${BADLINESCOUNT} ${ORIGINALFILE} | wc -c)\n" | bc ) ${ORIGINALFILE}
수동으로 수행 할 수있는 방법은 다음과 같습니다 (파일의 마지막 줄을 빠르게 제거해야 할 때이 방법을 개인적으로 많이 사용합니다).
vim + [FILE]
이 +
기호는 vim 텍스트 편집기에서 파일을 열 때 커서가 파일의 마지막 줄에 위치 함을 의미합니다.
이제 d
키보드 를 두 번 누르 십시오. 이렇게하면 원하는대로 정확하게 수행 할 수 있습니다. 마지막 줄을 제거하십시오. 그 후, Enter 키를 눌러 :
다음 x
을 누른 다음을 누릅니다 Enter
. 변경 사항이 저장되고 셸로 돌아갑니다. 이제 마지막 줄이 성공적으로 제거되었습니다.
루비 (1.9+)
ruby -ne 'BEGIN{prv=""};print prv ; prv=$_;' file
참고 URL : https://stackoverflow.com/questions/4881930/remove-the-last-line-from-a-file-in-bash
'Programing' 카테고리의 다른 글
MySQL에서 --secure-file-priv를 어떻게 해결해야합니까? (0) | 2020.03.17 |
---|---|
다른 스레드의 메인 스레드에서 코드 실행 (0) | 2020.03.17 |
"이 응용 프로그램은 백그라운드 스레드에서 자동 레이아웃 엔진을 수정하고 있습니다"오류가 발생합니까? (0) | 2020.03.17 |
htaccess는 https : // www로 리디렉션 (0) | 2020.03.17 |
“continue”키워드 란 무엇이며 Java에서 어떻게 작동합니까? (0) | 2020.03.17 |