私のファイルにはカンマ区切りの行があります。列ヘッダーはなく、カンマで区切られた「名前=値」のペアのみがあります。以下はいくつかのテストデータです。
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
。
grep
とPCRE:$ grep -oP '(GRAPE|FRUIT)=\K.*?(?=,)' file purple yes violet affirmative
同じ行に配置するには、解析するだけです。例えば
$ grep -oP '(GRAPE|FRUIT)=\K.*?(?=,)' | paste -d" " - - – purple yes violet affirmative
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
パール
$ 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
答え2
awkを使用してください:
awk -v RS="," -F= '/GRAPE/||/FRUIT/ {printf "%s ", $2}'
レコード区切り記号を改行からに変更し、フィールド区切り文字を,
スペースからに変更してから、パターンを含む行を=
一致させるGRAPE
かFRUIT
、同じ行に2番目に一致するフィールドをスペースで区切って印刷します。結果:
purple yes