0

Web からのログを含むファイルがあります。それの簡略化されたバージョンは次のとおりです。

en-GB,en-US;q=0.8,en    jsdjpksdkskd;lkskd;
en-GB,en-US;q=0.8,en    jsdjpksdkskd;lkskd;
en-GB,en-US;q=0.8,en    jsdjpksdkskd;lkskd;
Unix
Linux
en-GB,en-US;q=0.8,en    jsdjpksdkskd;lkskd;
START
Solaris
en-GB,en-US;q=0.8,en    jsdjpksdkskd;lkskd;
Aix
SCO

awk/sedで以下を使用して、すべての行の先頭であるAccept-Languageを識別するために、いくつかの正規表現の組み合わせを試しました。

/^[a-z]{2}(-[A-Z]{2})?/
/\*|[A-Z]{1,8}(-[A-Z0-9]{1,8})*/i  
/([^-;]*)(?:-([^;]*))?(?:;q=([0-9]\.[0-9]))?/

これまでのところ、 awk/sed を取得して次の結果を得ることができませんでした:

en-GB,en-US;q=0.8,en    jsdjpksdkskd;lkskd;
en-GB,en-US;q=0.8,en    jsdjpksdkskd;lkskd;
en-GB,en-US;q=0.8,en    jsdjpksdkskd;lkskd;
en-GB,en-US;q=0.8,en    jsdjpksdkskd;lkskd;    Unix    Linux
en-GB,en-US;q=0.8,en    jsdjpksdkskd;lkskd;    STAR    Solaris
en-GB,en-US;q=0.8,en    jsdjpksdkskd;lkskd;    Aix    SCO

どんな助けでも大歓迎です。このファイルには約 100 万件以上のレコードが含まれているため、sed/awk を使用せずにパフォーマンスを向上させるルートをたどることができてうれしいです。

4

3 に答える 3

0

楽しみのために、ここに sed ソリューションがあります:

sed -ne 1bgo \
   -e '/^[a-z][a-z]-[A-Z][A-Z]/ { x;p;s/.*//;x; };:go' \
   -e 'H;x;s/^\n//;s/\n/  /;x;${ x;p; }' < input

それはこのように動作します:

  • 各行を読み取りますが、すぐに印刷するのではなく、ホールド スペースに追加して保存しますH( x;s/^\n//;s/\n/ /;x)。(出力にタブが必要な場合は、いくつかのスペースを入れた場所にタブを配置してください。)

  • Accept-Language パターンに一致する行を見つけた場合は、何かを追加する前にホールド スペースをフラッシュします。印刷してクリアします ( x;p;s/.*//;x)。次に、通常どおり追加などを行います。

  • 最初の行と最後の行を他のすべての行とは異なる方法で扱います。最初の行だけを読み取った後はホールド スペースをフラッシュせず (1bgoそれをスキップして、 というラベルの付いた位置まで下げます:go)、最後の行を読み取った後は常にホールド スペースをフラッシュします ( ${ x;p; }) 。

于 2016-12-23T17:34:34.533 に答える
0
$ awk '/[a-z]{2}-[A-Z]{2}/ { print b; b=$0; next }  # @xx-XX empty buffer, refill
                           { b=b OFS $0 }           # otherwise append to buffer
                       END { print b }' file        # dump the buffer in the end

en-GB,en-US;q=0.8,en    jsdjpksdkskd;lkskd;
en-GB,en-US;q=0.8,en    jsdjpksdkskd;lkskd;
en-GB,en-US;q=0.8,en    jsdjpksdkskd;lkskd; Unix Linux
en-GB,en-US;q=0.8,en    jsdjpksdkskd;lkskd; START Solaris
en-GB,en-US;q=0.8,en    jsdjpksdkskd;lkskd; Aix SCO

出力を開始するための空の行が表示されます。また、必要に応じて、出力にタブ区切り文字を使用しますawk -v OFS="\t" ...

于 2016-12-25T10:59:53.930 に答える