web-dev-qa-db-ja.com

sedを使用してファイルの最後のn行を削除する方法

ファイルの末尾からn行を削除します。これはsedを使用して実行できますか?

たとえば、2から4までの行を削除するには、次のようにします。

$ sed '2,4d' file

しかし、行番号はわかりません。私はを使用して最後の行を削除することができます

$sed $d file

しかし、最後からn行を削除する方法を知りたいです。 sedや他の方法を使ってそれを行う方法を教えてください。

123
mezda

私はsedについて知りませんが、headでそれを行うことができます。

head -n -2 myfile.txt
189
ams

ハードコーディングnがオプションの場合は、sedへの順次呼び出しを使用できます。たとえば、最後の3行を削除するには、最後の1行を3回削除します。

sed '$d' file | sed '$d' | sed '$d'
26
Kyle

sed one-liners から:

# 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

あなたが探しているもののようです。

24
qstebom

面白い&シンプルなsedtacの解決策:

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

NOTE

  • シェルがsedコマンドで"変数を評価するには、二重引用符$nが必要です。一重引用符では、補間は実行されません。
  • tacは反転されたcatです。man 1 tacを参照してください
  • sed{}は、$ndを区切るためにあります(そうでない場合、シェルは存在しない$nd変数を補間しようとします)。
21
Gilles Quenot

sedを使用しますが、範囲を指定して(最後の23行を削除する)dコマンドを使用することを目的として、シェルに数学を実行させます。

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

最後の3行を裏返して削除するには

$(wc -l < file)

ファイルの行数を表示します。say 2196

最後の23行を削除したいので、左側または範囲については、

$((2196-22))

与えます:2174したがって、シェルの解釈後の元のsedは次のとおりです。

sed -i '2174,$d' file

-iがインプレース編集をしているので、ファイルは217行になりました。

新しいファイルに保存したい場合、コードは次のとおりです。

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

これにはheadを使うことができます。

つかいます

$ head --lines=-N file > new_file

nはファイルから削除する行数です。

元のファイルの内容から最後のN行を引いたものが、new_fileに入っています。

10
richard

完全を期すために、私は自分のソリューションを追加したいと思います。私は標準のedでこれをやってしまいました:

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

これは、インプレース編集を使用して最後の2行を削除します(ただし、/tmp !!に一時ファイルを使用します)。

7
Michel

非常に大きなファイルをその場で切り捨てるために、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
5
Kamil Christ

これはうまくいくかもしれません(GNU sed)。

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

上記の答えのほとんどはGNUコマンド/拡張を必要とするようです:

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

もう少し移植性の高いソリューションの場合:

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

OR

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

OR

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

「10」は「n」です。

2
DarkHeart

ここに答えがあれば、sedはこのアプリケーションに最適なツールではないことがすでにわかっています。

しかし、sedを使用することでこれを実行する方法があると思います。これは、EOFを押すことなく読み込めるまでスペースを空けるためにN行を追加することを目的としています。 EOFがヒットしたら、ホールドスペースの内容を印刷して終了します。

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

上記のsedコマンドは最後の5行を省略します。

2
Rishabh Sagar

次のコマンドを試してください。

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

それは3つのステップで行うことができます。

a)編集したいファイルの行数を数えます。

 n=`cat myfile |wc -l`

b)その数から削除する行数を引きます。

 x=$((n-3))

c)sedにその行番号($x)から最後まで削除するように指示します。

 sed "$x,\$d" myfile
1
Rey Lefebvre

あなたはwc -l <file>で総行数を得ることができ、そして

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

1
SWW13

これは最後の12行を削除します

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

最後の4行を削除するには

$ nl -b a file | sort -k1,1nr | sed '1, 4 d' | sort -k1,1n | sed 's/^ *[0-9]*\t//'   
0
mstafreshi
sed -n ':pre
1,4 {N;b pre
    }
:cycle
$!{P;N;D;b cycle
  }' YourFile

posixバージョン

0
NeronLeVelu

これはfileから最後の3行を削除します。

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

0
user5780554

私はこれを思いついた、ここで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. 一時ファイルを削除する
0
coyotetechy

ファイルの最後のN行を削除するには、同じ概念を使用できます。

$ sed '2,4d' file

ファイルを反転するには、tailコマンドと組み合わせて使用​​します。Nが5の場合

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

そしてこの方法はhead -n -5 fileコマンドが実行されない場所でも実行されます(Macの場合のように)。

0

私はこの解決法を好みます。

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

ここでNは削除する行数です。

0
p014k