awk:フィールドから文字列を抽出する[閉じる]

awk:フィールドから文字列を抽出する[閉じる]

入力フィールドはパイプ記号で区切られます。

CCCC|Sess C1|s1 DA=yy07:@##;/u/t/we
DDDDD|Sess C2|s4 DB=yy8:@##;/u/ba

最後のフィールド変更の出力を取得したい(対応するフィールドから最初の=と:の間の内容のみを抽出)

予想される出力は次のとおりです。

CCCC|Sess C1|yy07
DDDDD|Sess C2|yy8

ベストアンサー1

標準はawkスキーマに基づいてフィールドからデータを抽出するのにはあまり良くありません。いくつかのオプションは次のとおりです。

  • split()指定された区切り文字に基づいてテキストを配列に分割します。
  • match()一致が発生した場所を示す設定RSTARTと変数を指定し、一致する部分を抽出するために使用されます。RLENGTHsubtr()

だからここにあります:

awk -F'|' -v OFS='|' '
  split($3, a, /[=:]/) >= 2 {print $1, $2, a[2]}' < file.txt

=したがって、aまたはinの最初の発生と2番目の発生の間:の部分が返されます$3

または:

awk -F'|' -v OFS='|' '
  match($3, /=[^:]*/) {
    print $1, $2, substr($3, RSTART+1, RLENGTH-1)
  }' < file.txt

GNUには、コマンド機能を紹介する拡張awk機能があります。gensub()sedsawk

gawk -F'|' -v OFS='|' '
  $3 ~ /=/ {
    print $1, $2, gensub(/^[^=]*=([^:]*).*/, "\\1", 1, $3)
  }' < file.txt

=-s以外の数字が続くものを見つけて、:次の部分を抽出します=。問題gensub()は、交換が成功したかどうかは簡単にはわからないため、最初に含めるかどうかを$3確認する必要があることです=

そしてsed

sed -n 's/^\([^|]*|[^|]*|\)[^=|]*=\([^:|]*\).*/\1\2/p' < file.txt

そしてperl

perl -F'[|]' -lane 'print "$F[0]|$F[1]|$1" if $F[2] =~ /=([^:]*)/' < file.txt

おすすめ記事