ファイルの終わりからいくつかの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ワンライナーから:
# 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
ノート
"
シェルがコマンドで$n
変数を評価するには、二重引用符が必要です。sed
一重引用符では、補間は実行されません。tac
cat
逆になります。を参照してください。man 1 tac
{}
そうでない場合、シェルは存在しない変数を補間しようとします)sed
$n
d
$nd
を使用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
-i
インプレース編集を行うと、ファイルは2173行になります。
新しいファイルに保存する場合、コードは次のとおりです。
sed -i '2174,$d' file > outputfile
これには頭を使うことができます。
使用する
$ 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;'
また
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))
$x
c)その行番号( )から最後まで削除するようにsedに指示します。
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は削除する行数です。
最後の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バージョン
私はこれを思いついた。ここで、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
テールコマンドとの組み合わせを使用して、ファイルを反転できます。Nが5の場合
$ tail -r file | sed '1,5d' file | tail -r > file
そして、この方法は、head -n -5 file
コマンドが実行されない場所でも実行されます(Macのように!)。
Dockerでは、これは私のために機能しました:
head --lines=-N file_path >> file_path
#!/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
これにより、最後の12行が削除されます
sed -n -e :a -e '1,10!{P;N;D;};N;ba'