我有这种类型的数据(所有大字母都是字符串)
>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
尝试了此操作,但我无法替换两个|
之后的文本
先感谢您。
答案 0 :(得分:3)
Perl oneliner,
perl -F'\|' -lane 'print /\|/ ? join "|", @F[0,1,5] : $_' file
它将每一行拆分|
个字符,并将值存储在@F
数组中。如果行包含|
,则它从@F获取元素0,1和5,否则保持原样。
Oneliner沮丧,
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]) : $_;
}
答案 1 :(得分:3)
$ 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
答案 2 :(得分:2)
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
答案 3 :(得分:2)
或许gawk适合此
awk --re-interval -F'|'\
'NF > 4{$0=gensub(/^(([^|]*\|){2})([^|]*\|){3}(.*)$/, "\\1\\4", -1)};
{print}' file
答案 4 :(得分:1)
这应该这样做。 -i
选项指定要就地编辑文件。
perl -i.bak -pe 's/\|[CDE]//g' file
或使用sed
sed -i.bak -re 's/\|[CDE]//g' file
答案 5 :(得分:0)
awk工作正常:
awk '{sub(/C\|D\|E\|/,"")}1' file
>A|B|F
test test test
test test
>A|B|F
test test test
test