2

実行ポイントを示すサフィックスが異なるだけで多数の重複エントリを作成するアプリケーション用のログ ファイル要約ツールを作成しようとしています。

infile_grocery.txt一般化されたバージョンは次のとおりです。これらのコンテンツを含む text_file ( )。

milk skim fruit apple banana
milk skim fruit orange
milk skim fruit mango
milk skim fruit pomegranate
milk 2 percent fruit cherry tomato
milk 2 percent fruit peach
milk whole fruit pineapple
milk skim fruit strawberry raspberry
milk skim fruit strawberry rhubarb
milk whole fruit pineapple

私が得たいと思っているのは:

milk skim fruit apple banana, orange, mango, pomegranate
milk 2 percent fruit cherry tomato, peach
milk whole fruit pineapple
milk skim fruit strawberry raspberry, strawberry rhubarb
milk whole fruit pineapple

私が現在作成したコマンドラインは次のとおりです。

sed -rn "{H;x;s|^(.+) fruit ([^\n]+)\n(.*)\1 fruit (.+)$|\1 fruit \2, \4|;x}; ${x;s/^\n//;p}" infile_grocery.txt

しかし、私が得ている結果は次のとおりです。

milk skim fruit apple banana, mango, strawberry raspberry
milk skim fruit strawberry rhubarb
milk whole fruit pineapple

どういうわけか入力を破棄しています。これをどのように構築するかについてより良いアイデアを持っている教祖はいますか?

4

3 に答える 3

4

これがawk解決策です。

awk -F fruit '
$1==x{
    printf ",%s", $2
    next
}
{
    x=$1
    printf "\n%s", $0
}
END {
    print ""
}' input.txt 

出力

milk skim fruit apple banana, orange, mango, pomegranate
milk 2 percent fruit cherry tomato, peach
milk whole fruit pineapple
milk skim fruit strawberry raspberry, strawberry rhubarb
milk whole fruit pineapple
于 2012-08-13T12:38:28.397 に答える
0
opref=""
nline=""
while read line; do
  pref=`echo $line | sed 's/\(.*fruit\).*/\1/'`
  item=`echo $line | sed 's/.*fruit\s\(.*\)/\1/'`
  if [ "$opref" == "$pref" ]; then
    nline="$nline, $item"
  else
    [ "$nline" != "" ] && echo $nline
    nline=$line
  fi  
  opref=$pref
done < input_file
于 2012-08-13T13:09:56.277 に答える
0

これはうまくいくかもしれません(GNU sed):

sed ':a;$!N;s/^\(\(.*fruit\).*\)\n\2\(.*\)/\1,\3/;ta;P;D' file

説明:

  • :aループのプレースホルダーです
  • $!N最終行を除いて改行を追加し、その後に次の行を追加します。
  • s/^\(\(.*fruit\).*\)\n\2\(.*\)/\1,\3/改行までのすべてを後方参照 1 (別名\1) に収集します。この中で、行頭からfruit後方参照 2 (aka \2) への単語を含むすべてを収集します。一致に続くすべて\2を後方参照 3 (別名\3) に収集します。この正規表現を後方参照 1 に置き換え、その後にコンマ、スペース、後方参照 3 を続けます。
  • ta置換が true の場合、プレースホルダーへのループ:a
  • P置換が false の場合は、パターン スペースの最初の改行までを含めて出力します。
  • D置換が false の場合は、パターン スペースの最初の改行まで削除します。
于 2012-08-13T18:57:59.563 に答える