Grep变量并在下一列上循环

Grep变量并在下一列上循环,r,bash,R,Bash,我有一个大的排序数据文件的格式 car 54.9 car 33.2 car 29.7 Bike 96.1 Bike 94.6 Bike 80 我希望分数值与第一个值相比较,即对于每个变量(汽车和自行车),将第二列中的数字除以该变量的最高数字。 期望输出 car 1 car 0.6 car 0.54 Bike 1 Bike 0.98 Bike 0.83 我可以grep变量,但是如何循环R中的第二列,我们可以使用data.table(通过read.table/read.csv

我有一个大的排序数据文件的格式

car 54.9

car 33.2

car 29.7

Bike 96.1

Bike 94.6

Bike 80
我希望分数值与第一个值相比较,即对于每个变量(汽车和自行车),将第二列中的数字除以该变量的最高数字。 期望输出

car 1

car 0.6

car 0.54

Bike 1

Bike 0.98

Bike 0.83

我可以grep变量,但是如何循环
R
中的第二列,我们可以使用
data.table
(通过
read.table/read.csv
data.table
读取数据集后)。将“data.frame”转换为“data.table”(
setDT(df1)
),按“Col1”分组,我们将“Col2”除以“Col2”的最大值,并将其分配回“Col2”

library(data.table)
setDT(df1)[, Col2 := round(Col2/max(Col2), 2) , by = Col1]
df1
#   Col1    Col2
#1:  car    1.00
#2:  car    0.60
#3:  car    0.54
#4: Bike    1.00
#5: Bike    0.98
#6: Bike    0.83
数据
df1在
R
中,我们可以使用
data.table
(通过
read.table/read.csv
fread
data.table
读取数据集后)。将“data.frame”转换为“data.table”(
setDT(df1)
),按“Col1”分组,我们将“Col2”除以“Col2”的最大值,并将其分配回“Col2”

library(data.table)
setDT(df1)[, Col2 := round(Col2/max(Col2), 2) , by = Col1]
df1
#   Col1    Col2
#1:  car    1.00
#2:  car    0.60
#3:  car    0.54
#4: Bike    1.00
#5: Bike    0.98
#6: Bike    0.83
数据
df1使用awk,您可以这样做:

$ awk '$1!=l{l=$1;m=$2}{$2/=m}1' file
car 1
car 0.604736
car 0.540984
Bike 1
Bike 0.984391
Bike 0.832466
这要求文件先按列$1排序,然后按列$2降序

这是怎么回事?逐行扫描输入文件。第一学期<代码>$1=l{l=$1;m=$2}
过滤第一个单词等于变量
l
的行。如果发现它们不相等(这将发生在块的第一行),第一个字将存储在
l
行中(这样我们可以确定下一个块的开始位置。第二个字存储在变量
m
中。由于这是块的第一行,并且文件已排序,因此这是块的最大值

对所有行执行下一个术语
{$2/=m}
(因为它不包含过滤器),并用最大值(存储在变量
m
中)的除法替换第二个字


最后一个块
1
表示一个真实的条件,默认操作是打印当前行,因此所有行都被打印。

使用awk,您可以这样做:

$ awk '$1!=l{l=$1;m=$2}{$2/=m}1' file
car 1
car 0.604736
car 0.540984
Bike 1
Bike 0.984391
Bike 0.832466
这要求文件先按列$1排序,然后按列$2降序

如何工作?逐行扫描输入文件。第一个术语
$1!=l{l=$1;m=$2}
过滤第一个单词等于变量
l
的行。如果发现它们不相等(将发生在块的第一行),则第一个单词存储在
l
行中(这样我们就可以确定下一个块的起始位置。第二个字存储在变量
m
中。因为这是块的第一行,并且文件已排序,所以这是块的最大值

对所有行执行下一个术语
{$2/=m}
(因为它不包含过滤器),并用最大值(存储在变量
m
中)的除法替换第二个字


最后一个块
1
,表示一个真实的条件,默认操作是打印当前行,因此所有行都被打印。

@RHertel谢谢,我没有注意到
最高的
@RHertel谢谢,我没有注意到
最高的
你能解释一下吗bit@Haroon:当然,我做了编辑。如果有,请告诉我事情还不清楚,你解释一下bit@Haroon:当然,我做了编辑。如果还有什么不清楚的地方,请告诉我