【问题标题】:Isolating values found in grep -A results隔离在 grep -A 结果中找到的值
【发布时间】:2018-03-22 04:38:25
【问题描述】:

感谢您抽出宝贵时间回答这些问题。我有一个电话帐单,我想通过 bash 处理。我已经使用 grep、awk 和 sed 找到了一些我需要的值,但我不确定如何找到其余的。我正在使用 grep 在大文件中查找第一行代码,但如果有更好的方法,我愿意接受。这是我的例子。

garbage
garbage
Phone usage details for 777-555-1234
garbage
garbage
garbage
Total Long Distance 124.82
garbage
garbage
Total International 23456.01
garbage
garbage
Phone usage details for 777-444-0987

我需要在下一个数字之前获取每个总数,然后将它们相加,但我可以算出那部分。如果我能得到如下结果,我会很高兴。

Phone usage details for 777-555-1234
Total Long Distance 124.82
Total International 23456.01

提前感谢您的任何帮助或意见。

【问题讨论】:

  • 你现在有什么?
  • 正确答案完全取决于您通过重复使用单词 garbage 所代表的文本的可能值,因此无论您得到什么答案,都可以使用 YMMV。如果您需要更多帮助,请将“垃圾”替换为一些真正具有代表性的文字。

标签: bash awk grep


【解决方案1】:

遵循 awk 可能会对您有所帮助。

awk '
/Phone usage details for/ && flag{
  printf("%s%s%.2f%s%.2f\n",val,"\nTotal Long Distance ",sum_long,"\nTotal International ",sum_inter);
  sum_long=sum_inter=""
}
/Phone usage details for/{
  val=$0;
  flag=1;
  next
}
flag && /Total Long Distance/{
  sum_long+=$NF;
  next
}
flag && /Total International/{
  sum_inter+=$NF
}
'   Input_file

输出如下。

Phone usage details for 777-555-1234
Total Long Distance 124.82
Total International 23456.01

【讨论】:

    【解决方案2】:

    一切都在这里学习,但 OP 必须先告诉他尝试了什么,然后再给他一个解决方案,比如 123 说的。 所以用 sed。

    sed -n '/Phone/{h;:A;n;/Total/!bA;H;:B;n;/Total/!bB;H;x;p}' infile
    

    【讨论】:

    • 这是迄今为止效果最好的。这是一个pdf文件,所以我必须使用less infile | sed 如果总数超过两个怎么办?在任何部分中,最多可有 5 个总数。感谢您的意见。
    • 我不明白为什么必须少用。你可以试试这个新的:sed -n '/Phone/{$p;h;:A;${x;p};n;/Phone/{x;p;x;h;bA};/Total/!bA;H;bA}' infile
    猜你喜欢
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 2015-09-09
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多