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」を探しているので、このシリーズの 1 行目と 3 行目を印刷したいと思います。しかし、私が使用する場合:

cat t.txt | sed -n '/B34/p' | awk '{print $1", "$4" "$5}' | sed 's/B//g'

「B34」は「B344879」の最初の 3 文字と一致するため、4 行目も出力されます。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

この行を試してください:

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}' 

test を参照してください: 最初の行は特別な場合です。

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 | 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 に答える