【问题标题】:Match value in two files and replace values in columns匹配两个文件中的值并替换列中的值
【发布时间】:2019-02-21 13:06:10
【问题描述】:

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

如果任何值匹配做:

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

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

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

文件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

提前致谢

【问题讨论】:

    标签: awk


    【解决方案1】:
    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, 并等于在 BEGIN 块中的 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 块内,有时在读取文件之前或之间,甚至混合这些,这是因为回答者的偏好和/或在某些情况下,为了简洁起见。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-14
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多