假设我们有以下数据
B346879 length: 12 B34 L677
B111879 length: 32 B33 L677
B545879 length: 34 B34 L677
B344879 length: 98 B33 L677
B090879 length: 45 B33 L677
我正在寻找'B34'所以从这个系列我想要打印第1和第3行。 但如果我愿意的话:
cat t.txt | sed -n '/B34/p' | awk '{print $1", "$4" "$5}' | sed 's/B//g'
第4行也将被打印,因为'B34'匹配'B344879的前3个字符。我知道像sed 's/pattern/replacement/n'
之类的东西你只能替换正则表达式的第n个出现。但它如何与印刷一起使用。我试过像sed -n '/B34/2p'
这样的东西,但那是无效的。
答案 0 :(得分:2)
这可能适合你(GNU sed):
sed -rn 's/^\s*(\S+)\s+(\S+\s+){2}(B34)\s+(\S+)/\1, \3 \4/;T;s/B//g;p' file
答案 1 :(得分:1)
试试这一行:
awk '$4=="B34"' file
你的休息命令(sed,cat ...)可以合并到上面的单行中:
awk '$4=="B34"{gsub(/B/,"");print $1,$4,$5}' file
用你的例子测试它:
kent$ echo " B346879 length: 12 B34 L677
B111879 length: 32 B33 L677
B545879 length: 34 B34 L677
B344879 length: 98 B33 L677
B090879 length: 45 B33 L677"|awk '$4=="B34"{gsub(/B/,"");print $1,$4,$5}'
346879 34 L677
545879 34 L677
修改强>
awk将空格设为FS
,因此第3个字段的长度无关紧要,例如:
kent$ echo " B346879 length: 17777777777777777772 B34 L677
B111879 length: 32 B33 L677
B545879 length: 34 B34 L677
B344879 length: 98 B33 L677
B090879 length: 45 B33 L677"|awk '$4=="B34"{gsub(/B/,"");print $1,$4,$5}'
346879 34 L677
545879 34 L677
修改强>
好的,看看你的意思,所以这应该有效:
awk -F'length:[ 0-9]*' '$2~/^B34/{sub(/B/,"",$1);sub(/B/,"",$2);print $1,$2}'
见测试:第一行是特殊情况。
kent$ echo " B346879 length:212 B34 L677
B111879 length: 32 B33 L677
B545879 length: 34 B34 L677
B344879 length: 98 B33 L677
B090879 length: 45 B33 L677"|awk -F'length:[ 0-9]*' '$2~/^B34/{sub(/B/,"",$1);sub(/B/,"",$2);print $1,$2}'
346879 34 L677
545879 34 L677
答案 2 :(得分:1)
cat t.txt | awk '$4 == "B34" {print $1", "$4" "$5}'|sed s/B//g
答案 3 :(得分:1)
您可以在此处使用单词边界表示法\< ..\>
。
cat t.txt | sed -n '/\<B34\>/p' | awk '{print $1", "$4" "$5}' | sed 's/B//g'
输出
346879, 34 L677
545879, 34 L677
打印匹配的行。
sed -n '/\<B34\>/p' t.txt
输出
B346879 length: 12 B34 L677
B545879 length: 34 B34 L677