처음 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%가 삭제됩니다.