我有许多具有以下格式的文件:
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
...
等等。在所有行中,名称列之一包含文件名。我想删除包含文件名的整个条目,即使还有其他文本。因此,如果以上是输入,则所需的输出将是:
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
只要保证列内的字段非空且不包含空格,这就可以工作。