programing

sed를 사용하여 파일의 마지막 n 행을 삭제하는 방법

powerit 2023. 4. 13. 21:16
반응형

sed를 사용하여 파일의 마지막 n 행을 삭제하는 방법

파일 끝에서 n개의 행을 제거하고 싶습니다.sed로 할 수 있나요?

예를 들어, 2에서 4까지의 줄을 제거하려면

$ sed '2,4d' file

그런데 줄 번호는 몰라요.마지막 줄을 삭제할 수 있습니다.

$sed $d file

엔드에서 n개의 행을 삭제하는 방법을 알고 싶습니다.sed 등의 방법을 알려주세요.

에 i i i i i i i i i i i i i i i i i에 대해서.sed '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 이런 식으로 할 수 있어요.head:

head -n -2 myfile.txt

하드 코딩n 이 옵션인 경우 시퀀셜콜을 사용하여 설정할 수 있습니다.예를 들어 마지막 3줄을 삭제하려면 마지막 1줄을 3회 삭제합니다.

sed '$d' file | sed '$d' | sed '$d'

SED 원라이너부터:

# delete the last 10 lines of a file
sed -e :a -e '$d;N;2,10ba' -e 'P;D'   # method 1
sed -n -e :a -e '1,10!{P;N;D;};N;ba'  # method 2

당신이 찾고 있는 것 같군요.

sed을 하게 그은 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아★★★★★★★★★★★★★★★★★★,d(마지막 23줄을 삭제하기 위해) 범위를 지정하여 명령어를 실행합니다.

sed -i "$(($(wc -l < file)-22)),\$d" file

마지막 3줄을 안쪽에서 바깥쪽으로 제거하려면:

$(wc -l < file)

파일의 줄 수를 지정합니다(예: 2196).

마지막 23 행을 삭제하고 싶기 때문에 왼쪽 또는 범위:

$((2196-22))

제공: 2174 쉘 해석 후 원본 sed는 다음과 같습니다.

sed -i '2174,$d' file

★★★★★★★★★★★★★★★★ -iinplace 편집을 하면 파일이 2173 행이 됩니다!

새 파일에 저장하는 경우 코드는 다음과 같습니다.

sed -i '2174,$d' file > outputfile

심플한 ★★★★★★★★★★★★★★★★★★★★★」sed ★★★★★★★★★★★★★★★★★」tac 설명:

n=4
tac file.txt | sed "1,$n{d}" | tac

메모

  • "합니다.$n입니다.sed명령어를 입력합니다.작은 따옴표로 묶으면 보간은 수행되지 않습니다.
  • tac는 입니다.cat 「」을 참조해 주세요.man 1 tac
  • {}sed $n&d하지 않는 하지 않는 합니다).$nd□□□□□□□□★

머리를 써야 할 것 같은데

사용하다

$ head --lines=-N file > new_file

여기서 N은 파일에서 삭제할 줄 수입니다.

원본 파일에서 마지막 N 행을 뺀 내용이 new_file에 있습니다.

완성도를 높이기 위해 솔루션을 추가하고 싶습니다. 하게 되었습니다.ed:

ed -s sometextfile <<< $'-2,$d\nwq'

그러면 마지막 두 행이 일괄 편집을 사용하여 삭제됩니다(단, 임시 파일을 사용하는 경우)./tmp

큰 위해, 「」가 있습니다.truncate명령어를 입력합니다.은 몰라요.tail+wc는 행을바이트로 할 수 :행은 바이트로 변환할 수 있습니다.

file=bigone.log
lines=3
truncate -s -$(tail -$lines $file | wc -c) $file

파일이 동시에 작성되면 명백한 레이스 조건이 있습니다. 때는 '어울리지 않다'를 사용하는 수 .head파일의 선두로부터 바이트를 카운트하기 때문에(디스크의 IO를 의식해), 항상 라인 경계로 잘라냅니다(파일이 액티브하게 기입되어 있는 경우는, 예상보다 많은 행이 될 가능성이 있습니다).

truncate -s $(head -n -$lines $file | wc -c) $file

로그인 시도 실패 시 사용자 이름 대신 암호를 입력하는 편리한 원라이너:

truncate -s $(head -n -5 /var/log/secure | wc -c) /var/log/secure

이 방법이 효과적일 수 있습니다(GNU sed).

sed ':a;$!N;1,4ba;P;$d;D' file

위의 답변의 대부분은 GNU 명령/확장이 필요한 것 같습니다.

    $ head -n -2 myfile.txt
    -2: Badly formed number

조금 더 휴대하기 쉬운 솔루션의 경우:

     perl -ne 'push(@fifo,$_);print shift(@fifo) if @fifo > 10;'

또는

     perl -ne 'push(@buf,$_);END{print @buf[0 ... $#buf-10]}'

또는

     awk '{buf[NR-1]=$0;}END{ for ( i=0; i < (NR-10); i++){ print buf[i];} }'

여기서 "10"은 "n"입니다.

이 질문에 대한 답을 얻으면 SED가 이 응용 프로그램에 가장 적합한 도구가 아니라는 것을 이미 알게 될 것입니다.

그러나 sed를 사용하는 방법에는 방법이 있다고 생각합니다.즉, EOF를 누르지 않고 읽을 수 있을 때까지 N개의 행을 추가하여 공간을 유지하는 것입니다.EOF가 적중되면 홀드 공간의 내용을 인쇄하고 종료합니다.

sed -e '$!{N;N;N;N;N;N;H;}' -e x

위의 sed 명령어에서는 마지막 5행은 생략됩니다.

다음 3단계로 실행할 수 있습니다.

a) 편집하는 파일의 행수를 카운트 합니다.

 n=`cat myfile |wc -l`

b) 이 숫자에서 삭제할 줄 수를 뺍니다.

 x=$((n-3))

한다(c) sed).$x를로 설정합니다.

 sed "$x,\$d" myfile

는 ㄴㄴㄴ데 ㄴ데 ㄴ데 ㄴ데 ㄴ데 ㄴ데 ㄴ데 ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ.wc -l <file> 사용방법

head -n <total lines - lines to remove> <file>

다음 명령을 사용해 보십시오.

n = line number
tail -r file_name | sed '1,nd' | tail -r

은 '3'에서 됩니다.file:

for i in $(seq 1 3); do sed -i '$d' file; done;

저는 이 솔루션을 선호합니다.

head -$(gcalctool -s $(cat file | wc -l)-N) file

여기서 N은 삭제할 줄 수입니다.

sed -n ':pre
1,4 {N;b pre
    }
:cycle
$!{P;N;D;b cycle
  }' YourFile

Posix 버전

마지막 4줄을 삭제하려면:

$ nl -b a file | sort -k1,1nr | sed '1, 4 d' | sort -k1,1n | sed 's/^ *[0-9]*\t//'   

이 방법이 떠올랐습니다.여기서 n은 삭제할 줄 수입니다.

count=`wc -l file`
lines=`expr "$count" - n`
head -n "$lines" file > temp.txt
mv temp.txt file
rm -f temp.txt

조금 우회적이긴 하지만 따라가기 쉬울 것 같아요.

  1. 메인 파일의 줄 수를 세다
  2. 개수에서 제거할 줄 수를 뺍니다.
  3. 보관할 줄 수를 인쇄하여 임시 파일에 저장
  4. 메인 파일을 임시 파일로 바꿉니다.
  5. 임시 파일 삭제

파일의 마지막 N 행을 삭제할 때는, 같은 개념을 사용할 수 있습니다.

$ sed '2,4d' file

tail 명령어와 콤보를 사용하여 파일을 되돌릴 수 있습니다.N이 5인 경우

$ tail -r file | sed '1,5d' file | tail -r > file

그리고 이 길은 또 다른 곳으로 흘러간다.head -n -5 file맥!

#!/bin/sh

echo 'Enter the file name : '
read filename

echo 'Enter the number of lines from the end that needs to be deleted :'
read n

#Subtracting from the line number to get the nth line
m=`expr $n - 1`

# Calculate length of the file
len=`cat $filename|wc -l`

#Calculate the lines that must remain
lennew=`expr $len - $m`

sed "$lennew,$ d" $filename

https://stackoverflow.com/a/24298204/1221137과 비슷하지만 편집이 이루어지고 줄 수가 하드 코드화되지 않은 솔루션:

n=4
seq $n | xargs -i sed -i -e '$d' my_file

도커에서는 이 방법이 효과가 있었습니다.

head --lines=-N file_path > file_path

몇 개의 행이 있다고 합니다.

    $ cat <<EOF > 20lines.txt
> 1
> 2
> 3
[snip]
> 18
> 19
> 20
> EOF

그 후, 다음과 같이 할 수 있습니다.

# leave last 15 out
$ head -n5 20lines.txt
1
2
3
4
5

# skip first 14
$ tail -n +15 20lines.txt
15
16
17
18
19
20

POSIX를 사용한 :exvi@Michel @Michel @Michel'sed"Not-POSIX" Here-Strings 。「」를 인크리먼트 .$-1nEOF($)까지 회선을 표시하거나 원하는 회선을 공급합니다(d). 하면 .ex회선번호를 세거나 기타 Unix 작업을 수행합니다.

지정된 파일:

cat > sometextfile <<EOF
one
two
three
four
five
EOF

실행 중:

ex -s sometextfile <<'EOF'
$-1,$d
%p
wq!
EOF

반품:

one
two
three

이것은 POSIX Here-Docs 를 사용하기 때문에, 매우 간단하게 변경할 수 있습니다.특히set -o viPOSIX를 사용하여/bin/sh이 주제에 관해서는 "vim"의 "ex personality"는 괜찮지만 YMMV는 괜찮습니다.

그러면 마지막 12줄이 삭제됩니다.

sed -n -e :a -e '1,10!{P;N;D;};N;ba'

언급URL : https://stackoverflow.com/questions/13380607/how-to-use-sed-to-remove-the-last-n-lines-of-a-file

반응형