188

ファイルの終わりからいくつかのn行を削除したいと思います。これはsedを使用して実行できますか?

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

$ sed '2,4d' file

でも行番号はわかりません。を使用して最後の行を削除できます

$sed $d file

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

4

23 に答える 23

261

についてはわかりませんがsed、次の方法で実行できますhead

head -n -2 myfile.txt
于 2012-11-14T14:26:41.250 に答える
38

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

sed '$d' file | sed '$d' | sed '$d'
于 2014-06-19T03:16:25.070 に答える
34

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

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

于 2012-11-14T16:49:32.927 に答える
26

面白くてシンプルsedtac解決策:

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

ノート

  • "シェルがコマンドで$n変数を評価するには、二重引用符が必要です。sed一重引用符では、補間は実行されません。
  • taccat逆になります。を参照してください。man 1 tac
  • &を分離するためにあります({}そうでない場合、シェルは存在しない変数を補間しようとします)sed$nd$nd
于 2012-11-14T15:34:53.443 に答える
25

を使用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
于 2016-12-16T15:27:12.123 に答える
20

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

使用する

$ head --lines=-N file > new_file

ここで、Nはファイルから削除する行数です。

元のファイルから最後のN行を引いた内容がnew_fileに含まれるようになりました

于 2012-11-14T14:29:29.457 に答える
13

完全を期すために、ソリューションを追加したいと思います。私はこれを標準で行うことになりましたed

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

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

于 2015-10-23T08:24:31.737 に答える
6

非常に大きなファイルを実際にインプレースで切り捨てるために、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
于 2016-02-19T19:50:37.620 に答える
5

これはあなたのために働くかもしれません(GNU sed):

sed ':a;$!N;1,4ba;P;$d;D' file
于 2012-11-14T16:26:43.310 に答える
5

上記の回答のほとんどは、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」です。

于 2014-08-12T03:51:01.753 に答える
2

ここでの回答により、sedがこのアプリケーションに最適なツールではないことをすでに理解しているはずです。

ただし、sedを使用してこれを行う方法があると思います。EOFを押さなくても読み取れるようになるまで、スペースを保持するためにN行を追加するという考え方です。EOFがヒットしたら、ホールドスペースの内容を印刷して終了します。

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

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

于 2012-11-14T15:13:46.053 に答える
2

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

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

 n=`cat myfile |wc -l`

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

 x=$((n-3))

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

 sed "$x,\$d" myfile
于 2016-10-03T18:10:15.443 に答える
1

で行の総数を取得してwc -l <file>使用することができます

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

于 2014-04-24T12:46:04.170 に答える
1

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

n = line number
tail -r file_name | sed '1,nd' | tail -r
于 2015-03-16T10:34:21.207 に答える
1

これにより、最後の3行が次の場所から削除されfileます。

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

于 2016-01-12T18:39:32.603 に答える
0

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

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

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

于 2014-07-23T13:08:46.550 に答える
0

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

$ nl -b a file | sort -k1,1nr | sed '1, 4 d' | sort -k1,1n | sed 's/^ *[0-9]*\t//'   
于 2015-01-21T17:41:44.813 に答える
0
sed -n ':pre
1,4 {N;b pre
    }
:cycle
$!{P;N;D;b cycle
  }' YourFile

posixバージョン

于 2015-01-22T09:25:38.987 に答える
0

私はこれを思いついた。ここで、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. 一時ファイルを削除します
于 2015-05-21T18:48:54.167 に答える
0

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

$ sed '2,4d' file

テールコマンドとの組み合わせを使用して、ファイルを反転できます。Nが5の場合

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

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

于 2019-04-24T15:36:11.597 に答える
0

Dockerでは、これは私のために機能しました:

head --lines=-N file_path >> file_path
于 2020-08-21T23:04:31.697 に答える
0
#!/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
于 2021-06-05T18:46:08.213 に答える
-2

これにより、最後の12行が削除されます

sed -n -e :a -e '1,10!{P;N;D;};N;ba'
于 2018-05-24T19:39:41.447 に答える