次の形式のファイルがいくつかあります。
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
これは、列内のフィールドが空でないこと、および空白が含まれていないことが保証されている限り機能します。