我正在尝试为应用程序创建一个日志文件摘要工具,该工具创建了许多重复条目,只有不同的后缀来指示执行点。
这是一个通用版本:
包含这些内容的text_file(infile_grocery.txt
)。
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
我以某种方式丢弃了输入。任何大师都有更好的想法如何构建这个?
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分: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
如果替换为true,则为占位符:a
P
如果替换为false,请打印并包含模式空间中的第一个换行符。D
如果替换为false,请删除并包含模式空间中的第一个换行符。