ファイルの末尾からn行を削除します。これはsedを使用して実行できますか?
たとえば、2から4までの行を削除するには、次のようにします。
$ sed '2,4d' file
しかし、行番号はわかりません。私はを使用して最後の行を削除することができます
$sed $d file
しかし、最後からn行を削除する方法を知りたいです。 sedや他の方法を使ってそれを行う方法を教えてください。
私はsed
について知りませんが、head
でそれを行うことができます。
head -n -2 myfile.txt
ハードコーディングnがオプションの場合は、sedへの順次呼び出しを使用できます。たとえば、最後の3行を削除するには、最後の1行を3回削除します。
sed '$d' file | sed '$d' | sed '$d'
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
あなたが探しているもののようです。
面白い&シンプルなsed
とtac
の解決策:
n=4
tac file.txt | sed "1,$n{d}" | tac
NOTE
sed
コマンドで"
変数を評価するには、二重引用符$n
が必要です。一重引用符では、補間は実行されません。tac
は反転されたcat
です。man 1 tac
を参照してくださいsed
の{}
は、$n
とd
を区切るためにあります(そうでない場合、シェルは存在しない$nd
変数を補間しようとします)。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
これにはheadを使うことができます。
つかいます
$ head --lines=-N file > new_file
nはファイルから削除する行数です。
元のファイルの内容から最後のN行を引いたものが、new_fileに入っています。
完全を期すために、私は自分のソリューションを追加したいと思います。私は標準のed
でこれをやってしまいました:
ed -s sometextfile <<< $'-2,$d\nwq'
これは、インプレース編集を使用して最後の2行を削除します(ただし、は/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;'
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」です。
ここに答えがあれば、sedはこのアプリケーションに最適なツールではないことがすでにわかっています。
しかし、sedを使用することでこれを実行する方法があると思います。これは、EOFを押すことなく読み込めるまでスペースを空けるためにN行を追加することを目的としています。 EOFがヒットしたら、ホールドスペースの内容を印刷して終了します。
sed -e '$!{N;N;N;N;N;N;H;}' -e x
上記のsedコマンドは最後の5行を省略します。
次のコマンドを試してください。
n = line number
tail -r file_name | sed '1,nd' | tail -r
それは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>
これは最後の12行を削除します
sed -n -e :a -e '1,10!{P;N;D;};N;ba'
最後の4行を削除するには
$ nl -b a file | sort -k1,1nr | sed '1, 4 d' | sort -k1,1n | sed 's/^ *[0-9]*\t//'
sed -n ':pre
1,4 {N;b pre
}
:cycle
$!{P;N;D;b cycle
}' YourFile
posixバージョン
これはfile
から最後の3行を削除します。
for i in $(seq 1 3); do sed -i '$d' file; done;
私はこれを思いついた、ここでnはあなたが削除したい行の数である:
count=`wc -l file`
lines=`expr "$count" - n`
head -n "$lines" file > temp.txt
mv temp.txt file
rm -f temp.txt
ちょっとした回り道ですが、従うのは簡単だと思います。
ファイルの最後のN行を削除するには、同じ概念を使用できます。
$ sed '2,4d' file
ファイルを反転するには、tailコマンドと組み合わせて使用します。Nが5の場合
$ tail -r file | sed '1,5d' file | tail -r > file
そしてこの方法はhead -n -5 file
コマンドが実行されない場所でも実行されます(Macの場合のように)。
私はこの解決法を好みます。
head -$(gcalctool -s $(cat file | wc -l)-N) file
ここでNは削除する行数です。