2017-12-28 30 views
3

数値を2つ以上含む可能性のあるファイルから数値を1回だけ削除しようとしています。 FILE_INPUT =正確な番号を含むファイルから行を削除し、最初の検索と削除を終了します。

2 
4 
18 
8 
8 
10 
12 
14 

は、私が '8' を削除する必要がありますが、一度だけ、私は '18' を維持したいです。私はsed '/8/d'grep -v -w '8'awk '$1 !=8'を試してみました

2 
4 
18 
8 
10 
12 
14 

が、それらはすべて、8 8を削除して、私はGNUと示唆18

+0

をご覧ください:[誰かが私の質問に答えるとき、私は何をすべき?](http://stackoverflow.com/help/someone-answers) – Cyrus

+0

この関数は、使用時に別の番号を削除するために呼び出すことができるので、$ 8などのvarで '8'を置き換える方法は? – user312288

+0

変数: 'n =" 8 "; '$ n' '$/d}'ファイル ' – Cyrus

答えて

2

はsedを::最終的な結果は、次のようなfile_outputにする必要があります

sed '1,/^8$/{/^8$/d}' file 

出力:

 
2 
4 
8 
10 
12 
14 

神父最初の行から、81,/^8$/)の行だけを削除して、8/^8$/d)の行のみを削除します。


は、参照してください:最初のフィールドはとてもcがfalseに評価されるかどうかを確認した場合(cが得る、まさに8であればman sedThe Stack Overflow Regular Expressions FAQ

+0

これは、値8の前に88を追加しても欲しいものです。 – user312288

+0

同じコードを複数回(この場合は '/^8 $ /'など)書く必要がある場合は、別の解決策を探す必要があることを意味します。 –

1

はここawkバージョン

$ awk '!($1==8 && !c++)' ip.txt 
2 
4 
18 
8 
10 
12 
14 
  • $1==8 && !c++チェックですインクリメントされ、次回はfalseにならない) 0私たちは、これが真であるとき、印刷しない
    • 、したがって外側否定
  • これは質問
で与えられたサンプルのように、最初のフィールドの周りに空白が存在する場合でも動作します
+2

Ahem - ダブルネガティブ? 'awk '$ 1 == 8 &&!C++ {next} 1' ip.txt' –

0

はGNUとの別のアプローチは、sedを:

sed '/^8$/{0,//d}' file 
  • /^8$/を次の場合をが
  • 0,//dを発見された:最初の出現に削除されます
関連する問題