Awk 匹配两个文件中的值并替换列中的值

Awk 匹配两个文件中的值并替换列中的值,awk,Awk,其目的是检查file1中第3列和第4列的值是否与file2中的第1列匹配 如果任何值匹配,请执行以下操作: 1) 使用file1第5列和第6列的信息替换file2中第2列和第3列的值 2) 将文件2中的字符串($1,1,5)和字符串($1,6,5)替换为文件1中第7列和第8列的值 3) 为替换的行添加字符R,为未替换的行添加字符O file1 2,100,31431,37131,999991.70,0000000.30,11111,22222,3 3,100,31431,37471,111113

其目的是检查file1中第3列和第4列的值是否与file2中的第1列匹配

如果任何值匹配,请执行以下操作:

1) 使用file1第5列和第6列的信息替换file2中第2列和第3列的值

2) 将文件2中的字符串($1,1,5)和字符串($1,6,5)替换为文件1中第7列和第8列的值

3) 为替换的行添加字符R,为未替换的行添加字符O

file1

2,100,31431,37131,999991.70,0000000.30,11111,22222,3
3,100,31431,37471,111113.20,1111111.30,22222,33333,4
文件2

3143137113 318512.50 2334387.50 100
3143137131 318737.50 2334387.50 100
3143137201 319612.50 2334387.50 100
3143137471 322987.50 2334387.50 100
3143137491 323237.50 2334387.50 100
所需输出:

31431,37113,318512.50,2334387.50,100,O
11111,22222,999991.70,0000000.30,100,R
31431,37201,319612.50,2334387.50,100,O
22222,33333,111113.20,1111111.30,100,R
31431,37491,323237.50,2334387.50,100,O
我试过了

awk '
BEGIN{
  OFS=","
}
FNR==NR { 
f1_56[$3$4]=($5 OFS $6)
f1_78[$3$4]=($7 OFS $8)
          next
        }
{$(NF+1)="O"}
$1 in f1_56 {
  split(f1_56[$1], a, OFS)
  $2 = a[1]
  $3 = a[2]
  split(f1_78[$1], a, OFS)
  $1=a[1] OFS a[2]
  $NF="R"
} 1
' FS=, file1 FS=' ' file2
提前谢谢

awk '
BEGIN{
  OFS=","
}
FNR==NR { 
    f1_5[$3$4]=$5
    f1_6[$3$4]=$6
    f1_78[$3$4]=$7 OFS $8
    next
}
$1 in f1_78{
    $(NF+1)="R"
    $2=f1_5[$1]
    $3=f1_6[$1]
    $1=f1_78[$1]
    print
    next
}
{
    $(NF+1)="O"
    $1=substr($1,1,5) OFS substr($1,6,5)
} 
1 ' FS=, file1 FS=' ' file2
文件前的
FS=,
等于开始块中的开关
-F,
和等于
FS=“,”

substr
表示子字符串。
您自己的代码需要花费太多的精力,合并后再拆分,还不如再使用一个变量来存储另一个字段。
不过,你的方向是正确的,取得了很好的进展

试着放慢速度,阅读,思考。你可以先下载

将相同的代码放在一行中:

awk 'BEGIN{OFS=","}FNR==NR {f1_5[$3$4]=$5;f1_6[$3$4]=$6;f1_78[$3$4]=$7 OFS $8;next}$1 in f1_78{$(NF+1)="R";$2=f1_5[$1];$3=f1_6[$1];$1=f1_78[$1];print;next}{$(NF+1)="O";$1=substr($1,1,5) OFS substr($1,6,5)} 1 ' FS=, file1 FS=' ' file2
这与:

awk 'BEGIN{FS=OFS=","}FNR==NR {f1_5[$3$4]=$5;f1_6[$3$4]=$6;f1_78[$3$4]=$7 OFS $8;next}$1 in f1_78{$(NF+1)="R";$2=f1_5[$1];$3=f1_6[$1];$1=f1_78[$1];print;next}{$(NF+1)="O";$1=substr($1,1,5) OFS substr($1,6,5)} 1 ' file1 FS=' ' file2
awk -F, 'FNR==NR {f1_5[$3$4]=$5;f1_6[$3$4]=$6;f1_78[$3$4]=$7 OFS $8;next}$1 in f1_78{$(NF+1)="R";$2=f1_5[$1];$3=f1_6[$1];$1=f1_78[$1];print;next}{$(NF+1)="O";$1=substr($1,1,5) OFS substr($1,6,5)} 1 ' OFS=, file1 FS=' ' file2
亦同:

awk 'BEGIN{FS=OFS=","}FNR==NR {f1_5[$3$4]=$5;f1_6[$3$4]=$6;f1_78[$3$4]=$7 OFS $8;next}$1 in f1_78{$(NF+1)="R";$2=f1_5[$1];$3=f1_6[$1];$1=f1_78[$1];print;next}{$(NF+1)="O";$1=substr($1,1,5) OFS substr($1,6,5)} 1 ' file1 FS=' ' file2
awk -F, 'FNR==NR {f1_5[$3$4]=$5;f1_6[$3$4]=$6;f1_78[$3$4]=$7 OFS $8;next}$1 in f1_78{$(NF+1)="R";$2=f1_5[$1];$3=f1_6[$1];$1=f1_78[$1];print;next}{$(NF+1)="O";$1=substr($1,1,5) OFS substr($1,6,5)} 1 ' OFS=, file1 FS=' ' file2
实际上,与以下内容相同:

awk 'FNR==NR {f1_5[$3$4]=$5;f1_6[$3$4]=$6;f1_78[$3$4]=$7 OFS $8;next}$1 in f1_5{$(NF+1)="R";$2=f1_5[$1];$3=f1_6[$1];$1=f1_78[$1];print;next}{$(NF+1)="O";$1=substr($1,1,5) OFS substr($1,6,5)} 1 ' FS=, OFS=, file1 FS=' ' file2
您可以看到我们在各处放置分隔符变量,有时使用
-F
,有时在
开始
块内,有时在读取文件之前或之间,甚至混合这些变量,这是因为应答者的偏好和/或在某些情况下为了简洁起见

文件前的
FS=,
等于开始块中的开关
-F,
和等于
FS=“,”

substr
表示子字符串。
您自己的代码需要花费太多的精力,合并后再拆分,还不如再使用一个变量来存储另一个字段。
不过,你的方向是正确的,取得了很好的进展

试着放慢速度,阅读,思考。你可以先下载

将相同的代码放在一行中:

awk 'BEGIN{OFS=","}FNR==NR {f1_5[$3$4]=$5;f1_6[$3$4]=$6;f1_78[$3$4]=$7 OFS $8;next}$1 in f1_78{$(NF+1)="R";$2=f1_5[$1];$3=f1_6[$1];$1=f1_78[$1];print;next}{$(NF+1)="O";$1=substr($1,1,5) OFS substr($1,6,5)} 1 ' FS=, file1 FS=' ' file2
这与:

awk 'BEGIN{FS=OFS=","}FNR==NR {f1_5[$3$4]=$5;f1_6[$3$4]=$6;f1_78[$3$4]=$7 OFS $8;next}$1 in f1_78{$(NF+1)="R";$2=f1_5[$1];$3=f1_6[$1];$1=f1_78[$1];print;next}{$(NF+1)="O";$1=substr($1,1,5) OFS substr($1,6,5)} 1 ' file1 FS=' ' file2
awk -F, 'FNR==NR {f1_5[$3$4]=$5;f1_6[$3$4]=$6;f1_78[$3$4]=$7 OFS $8;next}$1 in f1_78{$(NF+1)="R";$2=f1_5[$1];$3=f1_6[$1];$1=f1_78[$1];print;next}{$(NF+1)="O";$1=substr($1,1,5) OFS substr($1,6,5)} 1 ' OFS=, file1 FS=' ' file2
亦同:

awk 'BEGIN{FS=OFS=","}FNR==NR {f1_5[$3$4]=$5;f1_6[$3$4]=$6;f1_78[$3$4]=$7 OFS $8;next}$1 in f1_78{$(NF+1)="R";$2=f1_5[$1];$3=f1_6[$1];$1=f1_78[$1];print;next}{$(NF+1)="O";$1=substr($1,1,5) OFS substr($1,6,5)} 1 ' file1 FS=' ' file2
awk -F, 'FNR==NR {f1_5[$3$4]=$5;f1_6[$3$4]=$6;f1_78[$3$4]=$7 OFS $8;next}$1 in f1_78{$(NF+1)="R";$2=f1_5[$1];$3=f1_6[$1];$1=f1_78[$1];print;next}{$(NF+1)="O";$1=substr($1,1,5) OFS substr($1,6,5)} 1 ' OFS=, file1 FS=' ' file2
实际上,与以下内容相同:

awk 'FNR==NR {f1_5[$3$4]=$5;f1_6[$3$4]=$6;f1_78[$3$4]=$7 OFS $8;next}$1 in f1_5{$(NF+1)="R";$2=f1_5[$1];$3=f1_6[$1];$1=f1_78[$1];print;next}{$(NF+1)="O";$1=substr($1,1,5) OFS substr($1,6,5)} 1 ' FS=, OFS=, file1 FS=' ' file2
您可以看到我们在各处放置分隔符变量,有时使用
-F
,有时在
开始
块内,有时在读取文件之前或之间,甚至混合这些变量,这是因为应答者的偏好和/或在某些情况下为了简洁起见