2012-03-06 42 views
1

分配ID于每行我有一个列,它是通过比较每个复发例如通过柱值在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 

的输出的表格文件使用第四列到下一行

使用awk可以快速执行吗?

thx求助

回答

5
awk '$3 != current {id++; current=$3} {print $0, id}' 
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: 像乔纳森·莱弗勒说,最初的部分是不是真的有必要在这里。因此,另一种可行的解决方案是:

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

+1:这是相当冗长;初始化部分可以被假定(你明确地做了'awk'确实隐含的)。 – 2012-03-06 20:50:08