1

我有这种类型的数据(所有大写字母都是字符串)

>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,但我无法替换两个之后的文本|
提前谢谢你。

4

6 回答 6

3

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]) : $_;
}
于 2013-09-29T19:32:27.940 回答
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
于 2013-09-29T20:17:48.540 回答
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
于 2013-09-29T19:30:54.733 回答
2

也许适合这个

awk --re-interval -F'|'\
      'NF > 4{$0=gensub(/^(([^|]*\|){2})([^|]*\|){3}(.*)$/, "\\1\\4", -1)};
      {print}' file
于 2013-09-29T19:39:37.957 回答
1

这应该这样做。该-i选项指定要就地编辑文件。

perl -i.bak -pe 's/\|[CDE]//g' file

或使用 sed

sed -i.bak -re 's/\|[CDE]//g' file
于 2013-09-29T19:47:59.733 回答
0

awk 也可以正常工作:

awk '{sub(/C\|D\|E\|/,"")}1' file
>A|B|F
test test test
test test
>A|B|F
test test test
test 
于 2015-11-13T18:16:41.173 回答