我有以下一行:
echo AS:i:0 UQ:i:0 ZZ:Z:mus.sup NM:i:0 MD:Z:50 ZZ:Z:cas.sup CO:Z:endOfLine|sed 's/.*\(ZZ:Z:.*[ ]\).*/\1/g'
输出:
ZZ:Z:cas.sup
我想使用sed从给定行中提取两个ZZ:Z
条目,例如(请避免使用awk,因为ZZ:Z
条目的位置可能因文件中的每一行而不同):
最好的输出:
ZZ:Z:mus.sup ZZ:Z:cas.sup
或者可能:
ZZ:Z:mus.sup
ZZ:Z:cas.sup
感谢。
答案 0 :(得分:1)
你可以通过sed
来实现它,但不会tr
和grep
解决方案更自然(因为你似乎实际上有不同的逻辑记录,尽管它们实际上是出现在一行上):
echo AS:i:0 UQ:i:0 ZZ:Z:mus.sup NM:i:0 MD:Z:50 ZZ:Z:cas.sup CO:Z:endOfLine | tr ' ' '\n' | grep "ZZ:Z"
如果您想将所有内容放回一行,只需在末尾添加| tr '\n' ' '
即可将\n
转换回空格。
当然,您也可以在此解决方案中将grep
替换为sed
。
答案 1 :(得分:1)
使用grep
(或-o
)标记试试--only-matching
:
$ grep -o 'ZZ:Z:[^ ]* ' <<< "AS:i:0 UQ:i:0 ZZ:Z:mus.sup NM:i:0 MD:Z:50 ZZ:Z:cas.sup CO:Z:endOfLine"
ZZ:Z:mus.sup
ZZ:Z:cas.sup
或sed
,基于此@potong answer:
sed 's/ZZ:Z:/\n&/g;s/[^\n]*\n\(ZZ:Z:[^ ]* \)[^\n]*/\1 /g;s/.$//'
如果每行只出现两次模式:
sed -n 's/.*\(ZZ:Z[^ ]*\).*\(ZZ:Z[^ ]*\).*/\1 \2/p' <<< "AS:i:0 UQ:i:0 ZZ:Z:mus.sup NM:i:0 MD:Z:50 ZZ:Z:cas.sup CO:Z:endOfLine"