正規表現を使用して行のN番目のフィールド文字列を照合する方法は?

正規表現を使用して行のN番目のフィールド文字列を照合する方法は?

私は15番目の単語のすべての行で文字列 "RAV"を一致させようとしています。各単語は「|」(パイプ)で区切られます。行にこの文字列があるかどうかを比較する必要があります。それでは、次のステップに進みます。

私はこれを試しています

((((?:[^|]*\|){17}(.*?)\|)+\|[^|]*$)|[^|]+(?=(\,\H\,))|(^([0-9]){4})|(([RAV]){3}))

しかし、最初、2番目、または他のフィールドが「RAV」の場合でも、これは一致します。フィールド 15 で正確に一致する項目が必要です。

ベストアンサー1

必ずしも正規表現を使用する必要はありません。

そしてawk

awk -F '|' '$15 == "RAV" { print }' myfile

myfileこれにより、15番目の|区切りフィールドが正確に文字列であるファイルのすべての行が印刷されますRAV。これは正規表現の一致ではなく文字列比較を使用します。

RAV15番目のフィールドの任意の位置で部分文字列に一致させるには、次のようにします。

awk -F '|' '$15 ~ /RAV/ { print }' myfile

これはRAV正規表現を拡張し、それを15番目の区切りフィールドのデータと一致させるために使用されます|。一致するものがあれば、現在の行を印刷します。

これが呼び出すのが難しい言語awk(シェルスクリプト以外の言語)で書かれた一部のスクリプトまたはプログラムの一部である場合は、区切り文字で文字列を分割し、|15番目の要素を選択して比較します。

awk擬似コード言語として使用すると、次のようになります。

nf = split($0, a, "|")
if (nf < 15)
    print "Not enough fields!" >"/dev/stderr"
else {
    if (a[15] == "RAV") print
}

またはPerlでは(今回はエラーを確認しません)

my @a = split /\|/, $string;
if ($a[15] eq "RAV") {
    print $string
}

上記の各バリエーション(初期awkコマンドを含む)では、print15番目のフィールドが一致すると判断した後にデータに対して実行する必要があるすべての操作を表しますRAV

おすすめ記事