【问题标题】:How can I use awk to print a numeric index based on a matching pattern?如何使用 awk 根据匹配模式打印数字索引?
【发布时间】:2020-06-25 18:56:58
【问题描述】:

我有一个逗号分隔的文件,其中包含两列,如下所示:

A,france
B,france
C,germany
D,germany
E,germany
F,spain
G,spain

我想使用 awk(或任何类似工具)为每个不同的组(本示例中的国家/地区)打印一个数值。即

A,france,1
B,france,1
C,germany,2
D,germany,2
E,germany,2
F,spain,3
G,spain,3

是否有无需手动指定每个组的简单方法来实现此目的?

【问题讨论】:

  • 在这样的情况下,我们确实鼓励用户发布他们为解决自己的问题所做的努力,所以请在您的问题中添加相同的内容,然后让我们知道(不是我的反对票) .

标签: awk


【解决方案1】:

使用关联数组t 表示团队编号。对于每一行,测试团队是否还不是数组中的键(值将等于空字符串),在这种情况下,增加计数器 i 的值并将 t 数组中的值设置为此增量后的计数器值。然后打印整行 ($0),然后是从关联数组中查找的值。

-F, -v OFS=, 在输入和输出上都使用字段分隔符 ,

awk -F, -v OFS=, '{if (t[$2]=="") {t[$2]=++i}; print $0,t[$2]}' filename

给予

A,france,1
B,france,1
C,germany,2
D,germany,2
E,germany,2
F,spain,3
G,spain,3

【讨论】:

  • 谢谢!这真的很有帮助,也是一个很好的解释。
【解决方案2】:

无论国家/地区是否在输入文件中排序,此单行代码都有效:

awk -F, -v OFS=',' '{a[$2]=a[$2]?a[$2]:++i}$3=a[$2]' file

例如:

$  awk -F, -v OFS=',' '{a[$2]=a[$2]?a[$2]:++i}$3=a[$2]' f 
A,france,1
B,france,1
C,germany,2
D,germany,2
E,germany,2
F,spain,3
G,spain,3
H,germany,2
I,germany,2
J,spain,3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 2011-07-20
    • 2013-07-28
    相关资源
    最近更新 更多