使用awk,在基于相同模式汇总行时忽略casesensitve模式

时间:2015-07-22 11:50:11

标签: awk case-insensitive counting

使用awk,我想在基于相同模式汇总行时忽略大小写敏感模式。

我有以下一行(非常感谢Andrey(https://stackoverflow.com/users/3476320/andrey

awk '{n=$1;$1="";a[$0]+=n}END{for(i in a){print a[i], i}}' testing.txt

文件内容:

1 Used cars
12 Drivers
1 used cars
1 used  cars
14 drivers
2 Used Cars

实际输出是

2  Used Cars
14  drivers
12  Drivers
2  used cars
1  Used cars

我需要的东西:

26 drivers/Drivers (doesn't matter)
5 used cars/Used Cars (doesn't matter)

谢谢!

2 个答案:

答案 0 :(得分:1)

来自AWK Manual

  

在程序的特定点执行不区分大小写的匹配的一种方法是使用tolower()或toupper()内置字符串函数将数据转换为单个大小写(我们还没有讨论过)但是;请参阅字符串函数)。例如:

tolower($1) ~ /foo/ { … }

  

另一种特定于gawk的方法是将变量IGNORECASE设置为非零值(请参阅内置变量)。当IGNORECASE不为零时,所有正则表达式和字符串操作都会忽略大小写。

另请注意:在awk $ 1中是第一个coloumn,$ 2是第二个... $ 0是整行。 (你不想用整行索引数组)

这适用于我的机器:

awk '{a[tolower($2) " " tolower($3)]+=$1;}END{for(i in a){print a[i], i}}' testing.txt

输出:

5 used cars
26 drivers

答案 1 :(得分:1)

也许是最简单的方法:

awk  '{$0=tolower($0);n=$1;$1="";a[$0]+=n}END{for(i in a){print a[i], i}}' file