パターンを含むエントリ全体を削除するにはどうすればよいですか?

パターンを含むエントリ全体を削除するにはどうすればよいですか?

次の形式のファイルがいくつかあります。

Num  name1  name2  value

たとえば、in1.sp というファイルは次のようになります。

 C1    in1    out1        3.9e-12
 C2    foo    st1/in1     1.2e-14
 C3    foo2   in1         8.3e-14
 ...

などです。すべての行で、名前列の 1 つにファイル名が含まれています。ファイル名が含まれている場合は、他のテキストがあってもエントリ全体を削除したいと思います。したがって、上記が入力の場合、望ましい出力は次のようになります。

 C1    out1    3.9e-12
 C2    foo     1.2e-14
 C3    foo2    8.3e-14
 ...

ありがとう!

答え1

もし私が正しく理解しているなら、これを試してください

for f in *.sp; do 
  sed "s/[^ ]*${f%.*}[^ ]*//" "$f" | column -t
done

出力:

C1  out1    3.9e-12
C2  foo     1.2e-14
C3  foo2    8.3e-14

答え2

私の理解が正しければ、ファイル名(拡張子を除く)に一致するフィールド値をすべて削除したいということですね。

もしそうなら、フィールドgrepごとに次の操作を実行できますperl

$ cat in1.sp 
 C1    in1    out1        3.9e-12
 C2    foo    st1/in1     1.2e-14
 C3    foo2   in1         8.3e-14

それから

$ perl -alpe '$_ = join "\t", grep { $_ !~ (split(/\./,$ARGV))[0] } @F' in1.sp 
C1  out1  3.9e-12
C2  foo   1.2e-14
C3  foo2  8.3e-14

答え3

awk希望する列を選択するために使用できます

$ awk '{print $1 "\t" $2 "\t" $4}' in1.sp 
C1  in1 3.9e-12
C2  foo 1.2e-14
C3  foo2    8.3e-14

これは、列内のフィールドが空でないこと、および空白が含まれていないことが保証されている限り機能します。

関連情報