按awk中的列值为每行分配ID

时间:2012-03-06 20:22:46

标签: awk

我有一个表格文件,其中的列是重复示例

toto tata AFG
fff ddd AFG
ff hhh AWM
qqq ttt AWM

我希望有一个像

这样的输出
toto tata AFG 1
fff ddd AFG 1
ff hhh AWM 2
qqq ttt AWM 2

使用第4列比较每一行与下一行

是否可以使用awk快速完成?

请求帮助

2 个答案:

答案 0 :(得分:5)

awk '$3 != current {id++; current=$3} {print $0, id}'

答案 1 :(得分:1)

将输入放在文件中。

$> cat ./text
toto tata AFG
fff ddd AFG
ff hhh AWM
qqq ttt AWM

对于每一行,我们应该记住$ 3-st值并检查它是否等于前一行。如果是真的 - 我们应该增加迭代器。

awk '
BEGIN {
    prevValue = "";
    value = "";
    iterator = 0;
}
{
    prevValue = value;
    value = $3;
    if (value != prevValue)
        iterator++;
    printf $0 " " iterator "\n"
}' ./text

所以我们得到的是这个

toto tata AFG 1
fff ddd AFG 1
ff hhh AWM 2
qqq ttt AWM 2

<强> UPD : 就像Jonathan Leffler所说,初始部分在这里并不是必需的。所以另一个可行的解决方案是:

awk '
{
    prevValue = value
    value = $3
    if (value != prevValue)
        iterator++
    print $0, iterator
}' ./text