2012-03-30 7 views
0

私は、タブ区切りのデータが16列にまたがっているテキストファイルを持っています。 6番目の列に値1260,1068、および907がある完全な行を削除したいとします。行を選択的に削除

9513 2010-06-15 17:00:00 94 0 69 12 0 0 0 0.0000 0 \N \N \N 2010-06-15 18:00:02 \N 
9523 2010-06-15 18:00:00 94 0 69 12 0 0 0 0.0000 0 \N \N \N 2010-06-15 19:00:02 \N 
9534 2010-06-15 19:00:00 94 0 69 12 0 0 0 0.0000 0 \N \N \N 2010-06-15 20:00:02 \N 
9543 2010-06-15 20:00:00 94 0 69 12 0 0 0 0.0000 0 \N \N \N 2010-06-15 21:00:02 \N 
9552 2010-06-15 21:00:00 94 0 69 12 0 0 0 0.0000 0 \N \N \N 2010-06-15 22:00:02 \N 
9560 2010-06-15 22:00:00 94 0 69 12 0 0 0 0.0000 0 \N \N \N 2010-06-15 23:00:02 \N 
9569 2010-06-15 23:00:00 94 0 69 12 0 0 0 0.0000 0 \N \N \N 2010-06-16 00:00:02 \N 
9579 2010-06-16 00:00:00 94 0 69 12 0 0 0 0.0000 0 \N \N \N 2010-06-16 01:00:02 \N 
9589 2010-06-16 01:00:00 94 0 69 12 0 0 0 0.0000 0 \N \N \N 2010-06-16 02:00:01 \N 
9599 2010-06-16 02:00:00 94 0 69 12 0 0 0 0.0000 0 \N \N \N 2010-06-16 03:00:02 \N 
95642733 2011-10-19 19:00:00 4341 0 1263 0 11 0 0 0.0000 0 \N \N \N 2011-10-19 20:05:06 \N 
95642732 2011-10-19 19:00:00 4341 0 1260 0 24635 0 0 0.0000 0 \N \N \N 2011-10-19 20:05:06 \N 
95642540 2011-10-19 19:00:00 4050 0 1068 103 113 2 0 0.0000 0 \N \N \N 2011-10-19 20:05:06 \N 
95642539 2011-10-19 19:00:00 4050 0 907 19 0 0 0 0.0000 0 \N \N \N 2011-10-19 20:05:06 \N 
+0

これは何か定期的でないなら、なぜ単にテキストにデータをロードしませエディタを開き、必要のない行を削除します。 (データの量はどれくらいですか?これらの値を持つ行は、多数のファイルで継続的に削除する必要がありますか?) – Kaz

+0

ファイル内のスペース文字はまったくありませんか、または「空白」はフィールドセパレータ? – ghoti

答えて

4

awkが使用するツールです。

awk '$6==1260 || $6==1068 || $6==907 {next} {print}' 

これは何をしますか?

Awkはファイルの各行にコードブロックを実行します。コードは、真(この場合は6番目のフィールドの3つの可能な値)を評価しなければならない式で始まり、中括弧で囲まれたコマンドが続きます。この場合、コマンドnextは、これ以上コマンドを実行しないで次の入力行に進むように指示します。

3つの比較が失敗し、nextが実行されない場合は、行を出力します。

0

私たちにしたいものはawkです。 AwkはUNIXの中で驚くほど強力な言語です。複雑なテストストリーミング問題に遭遇した場合、awkはあなたの解決策です。

は、このスクリプトを試してみてください。

awk '{ 
if ($6 != 1260 || $6 != 1068 || $6 != 907) 
    print $0; 
}' file.txt >> output_file.txt 
+1

彼は6列目を消したくないので、彼はその列を消したいと思っていました。 – ghoti

+0

ええ、私はスクリプトの作成の途中で忘れました。修正されました。 – theJollySin

-1
awk '$6!=1260 && $6!=1068 && $6!=907' file 
+1

文字列の等価性の場合に正規表現が不要です。さらに、この回答は9070などの行も削除します。 –

0

これはあなたのために働くかもしれない(GNU sedは?):

sed '/^\(\S*\s*\)\{5\}\(1260\|1068\|907\)\s/d' file 

または一般:

sed '/^\([^[:space:]]*[[:space:]]*\)\{5\}\(1260\|1068\|907\)[[:space:]]/!d' 
+0

AFAIK、 '{n}'表記はEREにすぎないので、これはLinuxの 'sed -r'(バックスラッシュを調整する)で行うことができます。完全な文字クラス名に切り替えるか、タブを正規表現の中に置くだけで、FreeBSDで動作するかもしれません。 – ghoti

+0

@ghoti私は '\ {m、n \}'はPOSIX BREだと思う[ここ](http://en.wikibooks.org/wiki/Regular_Expressions/syntax/posix_basic_regular_expression) – potong

+0

ああ、そうです。問題を引き起こす '\ S'と' \ s'だけです。 – ghoti

関連する問題