4

假设我们有以下数据

 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”,所以从这个系列中我想打印第一行和第三行。但如果我会使用:

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'但那是无效的。

4

4 回答 4

2

这可能对您有用(GNU sed):

sed -rn 's/^\s*(\S+)\s+(\S+\s+){2}(B34)\s+(\S+)/\1, \3 \4/;T;s/B//g;p' file
于 2013-10-15T23:52:15.530 回答
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
于 2013-10-15T21:15:01.530 回答
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,因此第三个字段的长度无关紧要,例如:

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
于 2013-10-15T20:54:10.840 回答
1
cat t.txt | awk '$4 == "B34" {print $1", "$4" "$5}'|sed s/B//g
于 2013-10-15T20:56:58.163 回答