入力フィールドはパイプ記号で区切られます。
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
と変数を指定し、一致する部分を抽出するために使用されます。RLENGTH
subtr()
だからここにあります:
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()
sed
s
awk
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