如果前两列在两个变量中相同,则替换第三列的值

时间:2017-06-26 10:32:58

标签: awk

如果前两列在两个变量中相同,我需要替换第三列的值。

我尝试过:使用$3=$3存储第一个变量的第一列和第二列。然后,如果第一列和第二列相同则 用变量“s”的第三列替换变量“b”的第三列。但是,做awk 'NR==FNR{a[$1FS$2]=$1FS$2;next} $1FS$2 in a {$3=$3}1' <(echo "$s") <(echo "$b") NODE AREA-29 1 UP ENABLED PINGABLE ASIA ACTIVE NODE AREA-21 1 UP ENABLED PINGABLE ASIA ACTIVE NODE AREA-20 1 UP ENABLED PINGABLE ASIA ACTIVE echo "$b" NODE AREA-29 1 UP ENABLED PINGABLE ASIA ACTIVE NODE AREA-21 1 UP ENABLED PINGABLE ASIA ACTIVE NODE AREA-20 1 UP ENABLED PINGABLE ASIA ACTIVE echo "$s" NODE AREA-21 2 NODE AREA-29 10 NODE AREA-20 1 没有任何意义。

NODE  AREA-29  10  UP   ENABLED     PINGABLE  ASIA                   ACTIVE
NODE  AREA-21  2   UP   ENABLED     PINGABLE  ASIA                   ACTIVE
NODE  AREA-20  1   UP   ENABLED     PINGABLE  ASIA                   ACTIVE

期望的结果:

User::chunk(100, function ($users) {
    foreach ($users as $user) {
    $temp=$user['attributes']; 
    unset($temp['_id']);
         $params = [
          'index' => 'test_index',
          'type' => $temp['type'],
          'id' => $temp['lid'],
          'body' => $temp
        ];
     $client = Elasticsearch::create()->build();
     $response = $client->index($params);
  }
});

2 个答案:

答案 0 :(得分:1)

正确的方式:

awk -v OFS='\t' 'NR==FNR{ a[$1,$2]=$3; next }(($1,$2) in a){ $3=a[$1,$2] }1' <(echo "$s") <(echo "$b")

输出:

NODE    AREA-29 10  UP  ENABLED PINGABLE    ASIA    ACTIVE
NODE    AREA-21 2   UP  ENABLED PINGABLE    ASIA    ACTIVE
NODE    AREA-20 1   UP  ENABLED PINGABLE    ASIA    ACTIVE
  

标准awk通过分隔下标来模拟多维数组   用逗号表示的值。这些值连接成一个字符串,   由 SUBSEP

的值分隔

答案 1 :(得分:0)

这是我的解决方案:

awk 'NR==FNR{a[$1FS$2]=$3;next}$1FS$2 in a { $3 = a[$1FS$2] }1' <(echo "$s") <(echo "$b") 

这个只需要3美元作为存储在数组a中的值。然后,如果找到匹配,则发生$ 3的替换。