我有这种类型的数据(所有大写字母都是字符串)
>A|B|C|D|E|F
test test test
test test
>A|B|C|D|E|F
test test test
test
并想删除 C、D、E:
>A|B|F
test test test
test test
>A|B|F
test test test
test
在“测试”文本中,没有|
发生。我已经尝试过这个sed
,但我无法替换两个之后的文本|
提前谢谢你。
Perl oneliner,
perl -F'\|' -lane 'print /\|/ ? join "|", @F[0,1,5] : $_' file
|
它按字符分割每一行并将值存储在@F
数组中。如果 line 包含|
它从 @F 获取元素 0,1 和 5,否则保持 line 原样。
一个班轮被分解,
perl -MO=Deparse -F'\|' -lane 'print /\|/ ? join "|", @F[0,1,5] : $_' file
BEGIN { $/ = "\n"; $\ = "\n"; } # -l switch makes print to add newline
LINE: while (defined($_ = <ARGV>)) { # -n switch
chomp $_; # -l switch chomps newlines
our(@F) = split(/\|/, $_, 0); # -a switch splits on value of -F switch
print /\|/ ? join('|', @F[0, 1, 5]) : $_;
}
$ cat file
>A|B|C|D|E|F
test test test
test test
>A|B|C|D|E|F
test test test
test
>gene_8|GeneMark.hmm|322_aa|+|3803|4771TS28_contig03869
test test test
test test
$
$ sed -r 's/(([^|]+\|){2})(([^|]+\|){3})/\1/' file
>A|B|F
test test test
test test
>A|B|F
test test test
test
>gene_8|GeneMark.hmm|4771TS28_contig03869
test test test
test test
sed
工作正常:
$ cat 1
>A|B|C|D|E|F
test test test
test test
>A|B|C|D|E|F
test test test
test
$ sed 's/C|D|E|//' 1
>A|B|F
test test test
test test
>A|B|F
test test test
test
更新
$ sed 's/\([^|]|[^|]|\).*|/\1/' 1
>A|B|F
test test test
test test
>A|B|F
test test test
test
也许gawk适合这个
awk --re-interval -F'|'\
'NF > 4{$0=gensub(/^(([^|]*\|){2})([^|]*\|){3}(.*)$/, "\\1\\4", -1)};
{print}' file
这应该这样做。该-i
选项指定要就地编辑文件。
perl -i.bak -pe 's/\|[CDE]//g' file
或使用 sed
sed -i.bak -re 's/\|[CDE]//g' file
awk 也可以正常工作:
awk '{sub(/C\|D\|E\|/,"")}1' file
>A|B|F
test test test
test test
>A|B|F
test test test
test