各行から部分文字列を抽出します。これらの部分文字列は、「名前=値」の形式でカンマで区切られます。

各行から部分文字列を抽出します。これらの部分文字列は、「名前=値」の形式でカンマで区切られます。

私のファイルにはカンマ区切りの行があります。列ヘッダーはなく、カンマで区切られた「名前=値」のペアのみがあります。以下はいくつかのテストデータです。

listoffruits,producelist,APPLE=red,BANNANA=yellow,GRAPE=purple,ORANGE=orange,FRUIT=yes,WATERMELON=green
listoffruits,producelist,APPLE=red,BANNANA=yellow,GRAPE=violet,ORANGE=orange,FRUIT=affirmative,WATERMELON=green

結果を得るためにGRAPE = *とFRUIT = *の値を取得したいと思います。

purple yes
violet affirmative

また、今後より多くの「熱」を追加できることを願っています(したがって、常にブドウ、果物ではありませんが、ブドウ、果物、スイカ)。

もう一つの障害は、柱が固定されていないということです。だから、スイカが最後の列であることを常に知らない。

私が得た最も近いのは@jasonwryanのものです。

awk -v RS="," -F= '/GRAPE/{a=$2}; /FRUIT/{b=$2} END{print a,b"\n"}'

しかし、これは次の代わりに「確かに紫色」という最後の行を出力します。

purple yes

violet affirmative

ベストアンサー1

より多くの選択。簡単にするためにサンプルテキストを保存しましたfile

  1. grepとPCRE:

    $ grep -oP '(GRAPE|FRUIT)=\K.*?(?=,)' file 
    purple
    yes
    violet
    affirmative
    

    同じ行に配置するには、解析するだけです。例えば

    $ grep -oP '(GRAPE|FRUIT)=\K.*?(?=,)' | paste -d" " - - –  
    purple yes
    violet affirmative
    
  2. sed

    $ sed 's/.*GRAPE=\([^,]*\).*FRUIT=\([^,]*\).*/\1 \2/' file 
    purple yes
    violet affirmative
    

    またはGNUを使用してください。sed

    $ sed -r 's/.*GRAPE=([^,]*).*FRUIT=([^,]*).*/\1 \2/' file 
    purple yes
    violet affirmative
    
  3. パール

    $ perl -pne 's/.*GRAPE=([^,]*).*FRUIT=([^,]*).*/\1 \2/' file 
    purple yes
    

    上記は上記と少し似ていることがわかりますsed。 :) または:

    $ perl -lne '@f=(/(?:(?<=GRAPE=)|(?<=FRUIT=))(.+?),/g); print "@f"' file 
    purple yes
    violet affirmative
    

    これは,フィールド区切り文字として機能し、すべてのフィールドを検索します。

    $ perl -F, -lane '@r=grep(s/.+?=//, grep(/GRAPE|FRUIT/,@F)); print "@r"' file 
    purple yes
    violet affirmative
    

    これは短いですが、各行に先行スペースを追加します。

    $ perl -F, -lane 'print grep(s/.+?=/ /, grep(/GRAPE|FRUIT/,@F));' file 
     purple yes
     violet affirmative
    

おすすめ記事