1行に2つの異なるパターンを文字列として印刷します。

1行に2つの異なるパターンを文字列として印刷します。

次の文字列を含むファイルがあります。

F1B308F2B3094F3B310F4B317CF5B312F6BC313DF7B315

文字列はトークン(この場合は「F」と数字)で区切られます。この場合、ラベルはF1、、、、、およびです。F2F3F4F5F6F7

F2次の5文字と次の6文字をF6スペースで区切って印刷したいと思います。

B3094 BC313D

1行ではなく2行に印刷されますが、ここに私の試みがあります。 2つの値を1行に入れる方法。

$ echo F1B308F2B3094F3B310F4B317CF5B312F6BC313DF7B315 | \
   awk '{match($0,/F2/); print substr($0, RSTART +2, RLENGTH +3);} \
        {match($0,/F6/); print substr($0, RSTART +2,RLENGTH +4);}'

ベストアンサー1

実行可能なソリューションに非常に近い。以下は1つのアプローチです(読みやすくするためにフォーマットされています)。

awk '{
    match($0,/F2/); 
    a=substr($0, RSTART +2, RLENGTH +3); 
    match($0,/F6/); 
    b=substr($0, RSTART +2,RLENGTH +4);
    print a" "b
}'

substr()この例では、直接印刷するのではなく、両方の関数を変数に割り当て、最後に同時に印刷するように設定します。単一の印刷呼び出しで印刷すると、awk行の各部分の後ではなく行の末尾に改行のみが追加されるため、結果は2行に分割されます。

bash:~$ echo F1B308F2B3094F3B310F4B317CF5B312F6BC313DF7B315 | awk '{match($0,/F2/); a=substr($0, RSTART +2, RLENGTH +3); match($0,/F6/); b=substr($0, RSTART +2,RLENGTH +4); print a" "b}'
B3094 BC313D

おすすめ記事