ファイルから1つ以上の特定の行番号を削除したい。sedを使用してこれをどのように実行しますか?
ファイルから1つ以上の特定の行番号を削除したい。sedを使用してこれをどのように実行しますか?
回答:
5行目から10行目と12行目を削除する場合:
sed -e '5,10d;12d' file
これにより、結果が画面に出力されます。結果を同じファイルに保存する場合:
sed -i.bak -e '5,10d;12d' file
これにより、ファイルがにバックアップされfile.bak
、指定された行が削除されます。
注:行番号は1から始まります。ファイルの最初の行は0ではなく1です。
sed -e '5,$d' file
sed -e '5d' file
。構文は次のとおりです<address><command>
。where <address>
はのような単一の行5
またはのような行の範囲のいずれか5,10
であり、コマンドd
は指定された行を削除します。アドレスは、正規表現、または$
ファイルの最終行を示すドル記号にすることもできます。
特定の単一行とその行番号を削除するには、
sed -i '33d' file
これにより、33行目の行が削除され、更新されたファイルが保存されます。
sed -i '0,/<TARGET>/{/<NEW_VALUE>/d;}' '<SOME_FILE_NAME>'
。ありがとう!
そしてawkも
awk 'NR!~/^(5|10|25)$/' file
$ cat foo
1
2
3
4
5
$ sed -e '2d;4d' foo
1
3
5
$
これは非常に頻繁にアンチパターンの症状です。行番号を生成したツールは、すぐに行を削除するツールに置き換えることができます。例えば;
grep -nh error logfile | cut -d: -f1 | deletelines logfile
(deletelines
あなたが必要としていると想像しているユーティリティはどこですか)は同じです
grep -v error logfile
そうは言っても、本当にこのタスクを実行する必要がある場合はsed
、行番号のファイルから単純なスクリプトを生成できます。ユーモラスに(しかし、少し混乱するかもしれませんが)これはで行うことができますsed
。
sed 's%$%d%' linenumbers
これは、行番号のファイルを1行に1つずつ受け入れ、標準出力で、同じ行番号をd
それぞれの後に追加して生成します。これは有効なsed
スクリプトであり、ファイルに保存したり、(一部のプラットフォームでは)別のsed
インスタンスにパイプしたりできます。
sed 's%$%d%' linenumbers | sed -f - logfile
いくつかのプラットフォームでは、sed -f
オプションの引数を理解していない-
あなたは、一時ファイルにスクリプトをリダイレクトし、作業が完了したときに、それをクリーンアップ、または多分との孤独なダッシュ交換する必要がありますので、標準入力を意味する/dev/stdin
か、/proc/$pid/fd/1
お使いのOS(またはシェルの場合を)それがあります。
いつものように、標準出力に結果を生成する代わり-i
に、-f
オプションの前に追加してsed
、ターゲットファイルを編集することができます。* BSDishプラットフォーム(OSXを含む)では、明示的な引数-i
も指定する必要があります。一般的なイディオムは、空の引数を提供することです。-i ''
。
p
はd
、の代わりにをオプションとともに使用します-n
(なし-n
では機能せず、また機能し!d
ません)。
awkで一般化を提案したいと思います。
ファイルが固定サイズのブロックで作成され、削除する行がブロックごとに繰り返される場合、awkはこのように正常に動作できます
awk '{nl=((NR-1)%2000)+1; if ( (nl<714) || ((nl>1025)&&(nl<1029)) ) print $0}'
OriginFile.dat > MyOutputCuttedFile.dat
この例では、ブロックのサイズは2000で、[1..713]と[1026..1029]の行を印刷します。
NR
awkが現在の行番号を格納するために使用する変数です。%
2つの整数の除算の剰余(または係数)を返します。nl=((NR-1)%BLOCKSIZE)+1
ここで、変数nlに現在のブロック内の行番号を書き込みます。(下記参照)||
and &&
は、論理演算子ORおよびANDです。print $0
フルラインを書きますWhy ((NR-1)%BLOCKSIZE)+1:
(NR-1) We need a shift of one because 1%3=1, 2%3=2, but 3%3=0.
+1 We add again 1 because we want to restore the desired order.
+-----+------+----------+------------+
| NR | NR%3 | (NR-1)%3 | (NR-1)%3+1 |
+-----+------+----------+------------+
| 1 | 1 | 0 | 1 |
| 2 | 2 | 1 | 2 |
| 3 | 0 | 2 | 3 |
| 4 | 1 | 0 | 1 |
+-----+------+----------+------------+