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

时间:2019-02-20 17:57:19

标签: awk

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

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

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

2)用file1中第7列和第8列的值替换file2中的字符串($ 1,1,5)和字符串($ 1,6,5)

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

文件1

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

预先感谢

1 个答案:

答案 0 :(得分:2)

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=,,然后在BEGIN块中等于文件-F,并等于FS=","
substr用于子字符串。
您自己的代码需要花费过多的精力,合并然后再次拆分,不妨只使用一个变量来存储另一个字段。
不过,您的方向正确,进度很好。

尝试放慢速度,阅读manual,然后思考。您可以先下载它。

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

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 '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,有时在BEGIN块中,有时在读取文件之前或之间,甚至混合使用,这是由于应答者的偏好和/或在某些情况下为简洁起见。