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

在awk中按列值为每行分配ID,awk,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快速完成吗 thx帮助将输入放入文件 $> cat ./text toto tata AFG fff ddd AFG ff hhh AWM qqq ttt

我有一个表格文件,其中有一列是经常出现的例子

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快速完成吗

thx帮助

将输入放入文件

$> 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
将输入放入文件中

$> 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

+1:这比较冗长,;可以假设初始化部分(您正在显式地做
awk
隐式地做的事情)。+1:这相当冗长;可以假定初始化部分(您正在显式执行
awk
隐式执行的操作)。