bash/sed 스크립트를 사용하여 텍스트 파일의 첫 줄을 제거하려면 어떻게 해야 합니까?
bash 스크립트를 사용하여 큰 텍스트 파일에서 첫 번째 줄을 반복적으로 제거해야 합니다.
는 지금 지은사중입다니용금다중을 사용하고 .sed -i -e "1d" $FILE
삭제하는 데 1분 정도 걸립니다.
이를 위해 더 효율적인 방법이 있습니까?
Try tail:
tail -n +2 "$FILE"
-n x
마지막을 인쇄하기만 하면 됩니다.x
줄들.tail -n 5
입력의 마지막 5줄을 제공합니다. 그+
주장을 뒤집는 것과 같은 서명을 하고 만듭니다.tail
번째 판이외의것인쇄다니합을초▁the▁anything▁first▁but다▁print초니합을 제외한 모든 것을 인쇄합니다.x-1
줄들.tail -n +1
할 수 .tail -n +2
번째을 제외한 를 들어, 예를 들어, 예를 들어.
GNUtail
훨씬빠다보다 훨씬 .sed
.tail
및 BSD에서 할 수도 .-n +2
플래그는 두 도구 모두에서 일치합니다.자세한 내용은 FreeBSD 또는 OS X man 페이지를 참조하십시오.
은 BSD 버전보다 수 .sed
래도그.나는 그들이 그것을 어떻게 처리했는지 궁금합니다.tail
을 한 줄한 줄 읽는 에는 파일을 .sed
스크립트 해석, 정규식 적용 등과 같은 복잡한 작업을 수행합니다.
참고: 다음을 사용할 수 있습니다.
# THIS WILL GIVE YOU AN EMPTY FILE!
tail -n +2 "$FILE" > "$FILE"
하지만 이것은 당신에게 빈 파일을 줄 것입니다.그 이유는 리다이렉션이>
는 이에발니다합생전다 앞에 합니다.tail
셸에 의해 호출됩니다.
- 에서 파일을 .
$FILE
- 셸은 다음을 위한 새 프로세스를 만듭니다.
tail
- 은 stdout .
tail
to 의처리.$FILE
tail
있는 에서 .$FILE
파일 내부의 첫 번째 줄을 제거하려면 다음을 사용해야 합니다.
tail -n +2 "$FILE" > "$FILE.tmp" && mv "$FILE.tmp" "$FILE"
그&&
문제가 있을 때 파일을 덮어쓰지 않도록 합니다.
'> 연산자를 사용하지 않고 -i를 사용하여 파일을 업데이트할 수 있습니다.다음 명령은 파일에서 첫 번째 줄을 삭제하고 파일에 저장합니다(후면 임시 파일 사용).
sed -i '1d' filename
GNU가 아닌 SunOS에 있는 사용자는 다음 코드를 사용하면 도움이 됩니다.
sed '1d' test.dat > tmp.dat
이 작업은 다음을 통해 쉽게 수행할 수 있습니다.
cat filename | sed 1d > filename_without_first_line
첫영구적으로 합니다.-i
플래그:
sed -i 1d <filename>
아니요, 그것은 당신이 얻을 수 있는 것만큼 효율적입니다.C 프로그램을 작성하면 작업 속도가 조금 더 빨라질 수 있지만(시작 시간과 인수 처리 시간이 적음) 파일이 커질수록 동일한 속도로 진행되는 경향이 있을 것입니다(1분 정도 소요되면 파일이 커질 것으로 예상됨).
하지만 여러분의 질문은 다른 많은 질문들과 마찬가지로 해결책을 전제로 한다는 점에서 같은 문제를 겪고 있습니다.어떻게 하시려는 것보다 구체적으로 말씀해주신다면 더 좋은 방법을 제안해드릴 수 있을 것 같습니다.
예를 들어, 만약 이것이 다른 B 프로그램이 처리하는 A 파일이라면, 한 가지 해결책은 첫 번째 줄을 떼어내지 않고, 그것을 다르게 처리하도록 B 프로그램을 수정하는 것입니다.
모든 프로그램이 이 파일 A에 추가되고 프로그램 B가 현재 첫 번째 줄을 읽고 처리한 후 삭제한다고 가정해 보겠습니다.
프로그램 B가 첫 번째 줄을 삭제하려고 하지 않고 파일 A로 영구적(아마도 파일 기반) 오프셋을 유지하도록 재설계하여 다음에 실행될 때 해당 오프셋을 찾고, 해당 라인을 처리하고, 오프셋을 업데이트할 수 있습니다.
그런 다음 조용한 시간(자정?)에 파일 A를 특수 처리하여 현재 처리 중인 모든 라인을 삭제하고 오프셋을 다시 0으로 설정할 수 있습니다.
프로그램이 열고 다시 쓰는 것보다 파일을 열고 찾는 것이 확실히 더 빠를 것입니다.이 논의는 당연히 당신이 B 프로그램에 대한 통제권을 가지고 있다고 가정합니다.그런 건지 모르겠지만 추가 정보를 제공해주시면 다른 해결책이 있을 수도 있습니다.
이 유틸리티를 사용하면 임시 파일을 저글링할 필요가 없습니다.
tail -n +2 "$FILE" | sponge "$FILE"
을 수정하고 든지 원본 할 수 .ed
스트리밍 후속 제품 대신sed
:
ed "$FILE" <<<$'1d\nwq\n'
그ed
명령어는 그래픽 워크스테이션은 고사하고 전체 화면 터미널조차 존재하기 전에 최초의 UNIX 텍스트 편집기였습니다. 그ex
잘 에디터, 콜기프트에서입때력것는으가사있잘다습장니알져려.vi
의 확장 버전입니다.ed
많은 동일한 명령이 작동합니다.하는 동안에ed
는 대화형으로 사용되며 일련의 명령을 전송하여 배치 모드에서 사용할 수도 있습니다. 이는 이 솔루션이 수행하는 작업입니다.
시스퀀<<<$'1d\nwq\n'
여기에 대한 현대적인 셸의 지원을 활용합니다.<<<
및 인용문 ) 및 ANSI 용문인($'
...'
에합니다.ed
두 된 명령:1d
1번 라인을 삭제한 다음wq
파일을 디스크에 다시 쓴 다음 편집 세션을 종료합니다.
팍스가 말했듯이, 여러분은 아마 이것보다 더 빨리 되지 않을 것입니다.그 이유는 파일의 처음부터 자르기를 지원하는 파일 시스템이 거의 없기 때문에 O(가 됩니다.n
where ) 가 실행됩니다.n
파일의 크기입니다.하지만 훨씬 더 빠르게 수행할 수 있는 것은 첫 번째 줄을 동일한 수의 바이트(공백 또는 주석 포함)로 덮어쓰는 것입니다. 이는 정확히 무엇을 하려는 것인지에 따라 유용할 수 있습니다.
파일을 편집할 수 있습니다.Perl을 사용하면 됩니다.-i
플래그, 다음과 같습니다.
perl -ni -e 'print unless $. == 1' filename.txt
이렇게 하면 요청하신 대로 첫 번째 줄이 사라집니다.Perl은 전체 파일을 읽고 복사해야 하지만 출력이 원래 파일 이름으로 저장되도록 정렬합니다.
첫 번째 줄을 제외한 줄을 표시해야 합니다.
cat textfile.txt | tail -n +2
vim을 사용하여 다음 작업을 수행할 수 있습니다.
vim -u NONE +'1d' +'wq!' /tmp/test.txt
vim은 처리할 때 전체 파일을 읽지 않기 때문에 더 빠를 것입니다.
csplit을 사용하면 어떨까요?
man csplit
csplit -k file 1 '{1}'
이 라이너 하나로 다음을 수행할 수 있습니다.
echo "$(tail -n +2 "$FILE")" > "$FILE"
효과가 있습니다.tail
이전에 됩니다.echo
그러면 파일이 잠금 해제되므로 임시 파일이 필요하지 않습니다.
삭제 속도를 높일 수 없는 것처럼 들리기 때문에 파일을 다음과 같이 일괄 처리하는 것이 좋을 것 같습니다.
While file1 not empty
file2 = head -n1000 file1
process file2
sed -i -e "1000d" file1
end
이것의 단점은 프로그램이 중간에 중단되거나 (또는 그 안에 "프로세스" 부분을 죽이거나 잠그게 만드는 나쁜 SQL이 있다면) 건너뛰거나 두 번 처리되는 줄이 있다는 것입니다.
(file1에는 SQL 코드 행이 포함되어 있습니다)
tail +2 path/to/your/file
나작동다한필, 는▁the없을 지정할 .-n
깃발. 이유는 아론의 대답을 참조하십시오.
당신은 할 수 .sed
하는 명령어입니다.
# create multi line txt file
echo """1. first
2. second
3. third""" > file.txt
선 삭제 및 stdout으로 인쇄
$ sed '1d' file.txt
2. second
3. third
$ sed '2d' file.txt
1. first
3. third
$ sed '3d' file.txt
1. first
2. second
# delete multi lines
$ sed '1,2d' file.txt
3. third
# delete the last line
sed '$d' file.txt
1. first
2. second
을 사용합니다.-i
을 인플레이스로 하는
$ cat file.txt
1. first
2. second
3. third
$ sed -i '1d' file.txt
$cat file.txt
2. second
3. third
장애 발생 후 복구하려는 작업이 있다면 지금까지 수행한 작업이 포함된 파일을 구축하면 됩니다.
if [[ -f $tmpf ]] ; then
rm -f $tmpf
fi
cat $srcf |
while read line ; do
# process line
echo "$line" >> $tmpf
done
다른 3가지 답변을 바탕으로 Mac OSx bash 셸에서 완벽하게 작동하는 구문을 생각해냈습니다.
line=$(head -n1 list.txt && echo "$(tail -n +2 list.txt)" > list.txt)
테스트 사례:
~> printf "Line #%2d\n" {1..3} > list.txt
~> cat list.txt
Line # 1
Line # 2
Line # 3
~> line=$(head -n1 list.txt && echo "$(tail -n +2 list.txt)" > list.txt)
~> echo $line
Line # 1
~> cat list.txt
Line # 2
Line # 3
N-1 줄에 꼬리를 사용하고 파일로 지시한 다음 이전 파일을 제거하고 새 파일의 이름을 이전 이름으로 변경하면 됩니까?
만약 제가 이것을 프로그램적으로 하고 있다면, 저는 파일을 다 읽고 각 줄을 읽은 후에 파일 오프셋을 기억할 것입니다. 그래서 저는 그 위치로 돌아가서 줄이 하나 적은 파일을 읽을 수 있을 것입니다.
언급URL : https://stackoverflow.com/questions/339483/how-can-i-remove-the-first-line-of-a-text-file-using-bash-sed-script
'programing' 카테고리의 다른 글
프로그램에 일관된 초기 현재 작업 디렉터리를 설정하려면 어떻게 해야 합니까? (0) | 2023.05.17 |
---|---|
Postgre에서 열의 위치를 변경하는 방법SQL 데이터베이스 테이블? (0) | 2023.05.17 |
Git 오류: src refspec 마스터가 일치하지 않습니다. (0) | 2023.05.17 |
C#에서 배열에서 요소를 삭제하는 방법 (0) | 2023.05.17 |
Mongodb String에서 ObjectId로 _id 필드에 가입 (0) | 2023.05.17 |