sed从文件和插入选项卡中删除所有管道符号

时间:2016-04-16 13:55:02

标签: sed

我正在尝试删除|末尾的$3并使用tab插入sed,但目前只有|被删除这在以后的awk命令中不起作用。有没有更好的办法?谢谢你:)。

输入

chr1    955542  955763|AGRN
chr1    957570  957852|AGRN
chr1    976034  976270|AGRN
chr1    976542  976787|AGRN

SED

sed 's/<|>/TAB/g' input > out

当前输出

chr1    955542  955763AGRN
chr1    957570  957852AGRN
chr1    976034  976270AGRN
chr1    976542  976787AGRN

2 个答案:

答案 0 :(得分:3)

如果你真的想要一个两步法,你可以删除|个字符。首先,然后将结果提供给awk(而不是在awk中完成所有操作 - 请参阅Lars Fischer对问题 [1] 的评论 ),最简单的方法是:

  tr '|' '\t' < input > out

顺便说一句,您的sed命令不会产生您引用的输出。 要在sed中执行此操作(除非您希望使用-i进行就地更新),否则您需要:

 # GNU Sed
 sed 's/|/\t/g'  input

 # BSD/OSX Sed, from bash/ksh/zsh:
 sed 's/|/'$'\t''/g'  input

 # Fully POSIX-compliant (from a shell that doesn't support $'...' strings)
 sed 's/|/'"$(printf '\t')"'/g' input

[1]添加说明:awk -F '[\t |]+' '...'-F(将特殊awk变量FS(输入字段分隔符)设置为正则表达式这使得您不仅可以识别以空格分隔的标记作为字段,还可以识别标记中包含的两个字段,例如955763|AGRN - 这意味着无需对输入进行预处理。
正则表达式[\t |]+表示:考虑任何混合的制表符,空格和管道符号的非空运行字段分隔符。

答案 1 :(得分:1)

awk '{sub(/\|/,"\t")}1' file

chr1    955542  955763  AGRN
chr1    957570  957852  AGRN
chr1    976034  976270  AGRN