쉘 명령을 사용하여 ASCII 파일의 처음 n 줄을 삭제하는 방법은 무엇입니까?

쉘 명령을 사용하여 ASCII 파일의 처음 n 줄을 삭제하는 방법은 무엇입니까?

처음 5-10줄에 ASCII 텍스트 정보가 포함되어 있고 그 뒤에 주의 깊게 표로 작성된 행렬 정보가 포함된 여러 파일이 있습니다. 쉘 스크립트에서 다른 프로그램에서 순수한 행렬 정보를 사용할 수 있도록 텍스트의 처음 몇 줄을 제거하고 싶습니다. bash 쉘 명령을 사용하여 이를 수행하려면 어떻게 해야 합니까?

도움이 된다면 RedHat과 Ubuntu Linux 시스템을 사용하고 있습니다.

답변1

파일이 심볼릭 링크나 하드 링크가 아닌 한 sed, tail 또는 awk를 사용할 수 있습니다. 아래 예.

$ cat t.txt
12
34
56
78
90

sed

$ sed -e '1,3d' < t.txt
78
90

임시 파일 없이 sed를 그 자리에서 사용할 수도 있습니다: sed -i -e 1,3d yourfile. 이는 아무 것도 표시하지 않고 파일을 제자리에서 수정하기만 합니다. 결과를 다른 명령으로 파이프할 필요가 없으면 더 쉽습니다.

꼬리

$ tail -n +4 t.txt
78
90

$ awk 'NR > 3 { print }' < t.txt
78
90

답변2

sed -i '1,3d' file.txt

file.txt에서 처음 3줄이 삭제됩니다.

답변3

목록 줄이 탭 문자가 있는 줄인 경우:

grep '␉' <input_file >output_file

( 리터럴 탭으로) 또는 이에 상응하는 것

sed -n '/␉/p' <input_file >output_file

bash/ksh/zsh 스크립트에서는 또는 $'\t'와 같은 탭을 작성할 수 있습니다 .grep $'\t'sed -n $'/\t/p'

파일의 처음 10줄을 삭제하려면 다음을 수행하세요.

tail -n +11 <input_file >output_file

(이것은 "행 11에서 시작"을 의미하고 꼬리 번호 매기기가 행 1에서 시작되므로 +11행 10을 제거하는 것 입니다) 또는+11

sed '1,10d' <input_file >output_file

Linux에서는 GNU sed의 옵션을 활용하여 -i파일을 수정할 수 있습니다.

sed -i -n '/\t/p' *.txt

또는 쉘 루프와 임시 파일을 사용할 수 있습니다.

for x in *.txt; do
  tail -n +11 <"$x" >"$x.tmp"
  mv "$x.tmp" "$x"
done

또는 파일을 현재 위치에서 수정하지 않고 다른 이름을 지정하려는 경우:

for x in *.txt; do
  tail -n +11 <"$x" >"${x%.txt}.data"
done

답변4

백분율로

를 사용하고 bash절대 줄 번호 대신 백분율 숫자를 사용하여 파일을 정리합니다.

sed -i -e 1,$( printf  "$((`cat php_errors.log | wc -l` * 75 /100 ))" )d php_errors.log

이 명령은 복사본을 만들지 않고 콘텐츠를 그 자리에서 삭제하므로 파괴적일 수 있습니다.

위 파일에서 줄의 처음 75%가 삭제됩니다.

관련 정보