在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
隐式执行的操作)。