使用 ID 文件替换数据集中的某些列,然后打印整个数据集
Use ID file to replace some columns in dataset then print entire datset
还是编码新手,很难连接命令以获得所需的输出。
我有以下格式的数据文件:
NationalCowID,TestDate,Batch,LN,DIM,YBr,year,CH4,PLS,qtl
206004574,20141208,6,2,92,1,2014,424.4410055,NA,1
206004573,20141209,6,2,93,2,2014,436.4504712,NA,4
206004575,20141207,6,2,91,1,2014,380.94688,NA,6
206004576,20141208,6,2,92,2,2014,424.4410055,NA,7
206004579,20141209,6,2,93,2,2014,436.4504712,NA,8
206004571,20141207,6,2,91,1,2014,380.94688,NA,9
在数据中,我想找到变量 YBr == 1 的行,并将该行中除 NationalCowID 或 qtl 之外的所有列替换为 *。然后打印整个数据集。
这就是我想要实现的目标
NationalCowID,TestDate,Batch,LN,DIM,YBr,year,CH4,PLS,qtl
206004574,20141208,*,*,*,*,*,*,*,*,1
206004573,20141209,6,2,93,2,2014,436.4504712,NA,4
206004575,20141207,*,*,*,*,*,*,*,*,6
206004576,20141208,6,2,92,2,2014,424.4410055,NA,7
206004579,20141209,6,2,93,2,2014,436.4504712,NA,8
206004571,20141207,*,*,*,*,*,*,*,*,9
我想出了使用 sed 和 awk 的方法,但我正在努力超越基础并结合使用命令:
awk -F ',' '{ if ( == 1) sed '{s/[=12=]/*/g}' print [=12=]}'}' file1 > file2
任何方向将不胜感激!
由于您没有向我们展示示例预期输出,因此无法确定是否遵循。通过这个解决方案,我没有对字符串 YBr
或 NationalCowID
的字段值进行硬编码,因此它也可以是动态的。能否请您尝试关注一次。
awk '
BEGIN{
FS=OFS=","
}
FNR==1{
for(i=1;i<=NF;i++){
if($i=="YBr"){
field=i
}
if($i=="NationalCowID"){
value=i
}
}
}
$field==1{
for(i=value+1;i<=NF;i++){
$i="*"
}
}
1
' Input_file
输出如下。
NationalCowID,TestDate,Batch,LN,DIM,YBr,year,CH4,PLS,qtl
206004574,*,*,*,*,*,*,*,*,*
206004573,20141209,6,2,93,2,2014,436.4504712,NA,4
206004575,*,*,*,*,*,*,*,*,*
206004576,20141208,6,2,92,2,2014,424.4410055,NA,7
206004579,20141209,6,2,93,2,2014,436.4504712,NA,8
206004571,*,*,*,*,*,*,*,*,*
还是编码新手,很难连接命令以获得所需的输出。
我有以下格式的数据文件:
NationalCowID,TestDate,Batch,LN,DIM,YBr,year,CH4,PLS,qtl
206004574,20141208,6,2,92,1,2014,424.4410055,NA,1
206004573,20141209,6,2,93,2,2014,436.4504712,NA,4
206004575,20141207,6,2,91,1,2014,380.94688,NA,6
206004576,20141208,6,2,92,2,2014,424.4410055,NA,7
206004579,20141209,6,2,93,2,2014,436.4504712,NA,8
206004571,20141207,6,2,91,1,2014,380.94688,NA,9
在数据中,我想找到变量 YBr == 1 的行,并将该行中除 NationalCowID 或 qtl 之外的所有列替换为 *。然后打印整个数据集。
这就是我想要实现的目标
NationalCowID,TestDate,Batch,LN,DIM,YBr,year,CH4,PLS,qtl
206004574,20141208,*,*,*,*,*,*,*,*,1
206004573,20141209,6,2,93,2,2014,436.4504712,NA,4
206004575,20141207,*,*,*,*,*,*,*,*,6
206004576,20141208,6,2,92,2,2014,424.4410055,NA,7
206004579,20141209,6,2,93,2,2014,436.4504712,NA,8
206004571,20141207,*,*,*,*,*,*,*,*,9
我想出了使用 sed 和 awk 的方法,但我正在努力超越基础并结合使用命令:
awk -F ',' '{ if ( == 1) sed '{s/[=12=]/*/g}' print [=12=]}'}' file1 > file2
任何方向将不胜感激!
由于您没有向我们展示示例预期输出,因此无法确定是否遵循。通过这个解决方案,我没有对字符串 YBr
或 NationalCowID
的字段值进行硬编码,因此它也可以是动态的。能否请您尝试关注一次。
awk '
BEGIN{
FS=OFS=","
}
FNR==1{
for(i=1;i<=NF;i++){
if($i=="YBr"){
field=i
}
if($i=="NationalCowID"){
value=i
}
}
}
$field==1{
for(i=value+1;i<=NF;i++){
$i="*"
}
}
1
' Input_file
输出如下。
NationalCowID,TestDate,Batch,LN,DIM,YBr,year,CH4,PLS,qtl
206004574,*,*,*,*,*,*,*,*,*
206004573,20141209,6,2,93,2,2014,436.4504712,NA,4
206004575,*,*,*,*,*,*,*,*,*
206004576,20141208,6,2,92,2,2014,424.4410055,NA,7
206004579,20141209,6,2,93,2,2014,436.4504712,NA,8
206004571,*,*,*,*,*,*,*,*,*