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(又名\2)中。将匹配后的所有内容收集\2到反向引用 3(又名\3)中。将此正则表达式替换为反向引用 1,后跟一个逗号、一个空格,然后是反向引用 3。
  • ta如果替换为真循环到占位符:a
  • P如果替换是错误的,则打印到并包括模式空间中的第一个换行符。
  • D如果替换为假,则删除直到并包括模式空间中的第一个换行符。
于 2012-08-13T18:57:59.563 回答