从行中删除文本

时间:2013-03-01 19:05:00

标签: bash unix sed awk

我有一个日志文件,我基本上记录了整个注销,切断字符串,直到只剩下两个字段,在字段1上唯一排序,并在字段编号和字段1相同时向右汇总字段。实施例

80 128 
443 40
80 100
25  20 
443 44
80 128 

结果将是

80 356
443 84
25  20

我遇到的问题是我在第一个字段中出现了不一致的情况,有时输出看起来像:

80 128

有时它是

80(LOCAL\randomuser) 128

所以我的输出最终看起来像

80 356
80(LOCAL\randomuser) 128
443 84
25  20

这是因为80(LOCAL \ randomuser)是一个唯一的行。

如何首先规范化第一个字段,以便从存在的行中删除(LOCAL \ randomuser),而没有(LOCAL \ randomuser)的行保持不变。

3 个答案:

答案 0 :(得分:1)

使用

awk '{a[$1]+=$NF} END{for (i in a) print i, a[i]}' input

即使用第一个字段作为键并添加最后一个字段。

如果您的示例中第一个数字和(之间没有空格,请告诉awk在(上拆分:

awk -F"[ (]+" '{a[$1]+=$NF} END{for (i in a) print i, a[i]}' input

输出:

$ awk '{a[$1]+=$NF} END{for (i in a) print i, a[i]}' input
25 20
80 356
443 84

另一种删除(LOCAL\randomuser)(如果存在)的方法,您可以使用sed

sed 's/(.*)//' input

答案 1 :(得分:1)

或强制$1进入数字背景:

awk '{A[$1+0]+=$NF} END{for (i in A) print i, A[i]}' file

答案 2 :(得分:0)

grep -v将匹配不包含模式的行。在grep之前将输出通过cut进行管道传输。