パターンに一致する行から値を抽出する

パターンに一致する行から値を抽出する

パターンマッチング後、N行目の値を抽出しようとしています'kappa (ts/tv) ='。次のコマンドを使用してawkを使用しています。

awk '/kappa (ts/tv) =/{print $NF}' text.txt

しかし、エラーが発生しました。

awk: cmd. line:1: error: Unmatched ( or \(: /kappa (ts/

「sed」を使用してもこのエラーが発生します。ここに正規表現の内容が欠けていることを知っています。

誰でもどんな提案をすることができますか?

答え1

そこに2つの質問があります。まず、一致演算子を/区切り文字として使用します。しかし、探しているパターンには/

/kappa (ts/tv) =/

/kappa (ts/次のように解釈されると、tv) =/構文エラーが発生します。脱出/して成功しなければなりません\/。次に、括弧は正規表現の文脈で特別な意味を持ちます(一部とにかく正規表現スタイル):一致するグループをキャプチャするために使用されます。したがって、必要なタスクを実行するにはエスケープも必要です。これらすべてを総合すると、次のようになります。

awk '/kappa \(ts\/tv\) =/{print $NF}' text.txt

答え2

これには2つの間違いがあります。角かっことスラッシュはエスケープする必要があります。全体として、次のようになります。

awk '/kappa \(ts\/tv\) =/ {print $NF}' text.txt

答え3

あなたの質問は十分に明確ではありません。私の答えはあなたの声明に基づいています。

「パターンマッチング後、N行の値を抽出してみてください...」

awk -v line_num_after_match=1 '
    NR==seen+line_num_after_match && seen { print; seen=0; };
    /kappa \(ts\/tv\) =/ && !seen { seen=NR; }' infile

次の入力から実行します。

line 1
line 2
line 3
line 4: kappa (ts/tv) =
line 5: another kappa (ts/tv) = but line 1 after match
line 6: but line 2 after first match and line 1 after second match
line 7: but line 3 after first match and line 2 after second match
line 8: yet another kappa (ts/tv) =
line 9: xxxxxxxx

返品:

line 5: another kappa (ts/tv) = but line 1 after match
line 6: but line 2 after first match and line 1 after second match
line 9: xxxxxxxx

答え4

sed コマンド

sed -n '/kappa (ts\/tv) =/p' filename

Python

#!/usr/bin/python
import re
l=re.compile(r'kappa \(ts\/tv\) =')
m=open('filename','r')
for h in m:
    if re.search(l,h):
        print h.strip()

~

関連情報