首页 > 解决方案 > 如果文件之间的第一个字段匹配,则将下一行替换为其他文件中的第二个字段

问题描述

如果文件之间的 ID 匹配,我正在尝试用另一个文件中的字符串替换文件中的行。

文件 1 包含四行一组的信息。带有 ID 的行有几列,其他行只包含一列:

ID1   some   other   information
ABCD
x
123
ID2   some   other   information
EFGH
x
456

文件 2 包含两列信息:

ID1   abcd
ID2   efgh

如果文件之间的 ID 匹配,我想将文件 1 的 ID 行之后的下一行替换为文件 2 的第二列,但保持所有其他信息不变,以便输出变为:

ID1   some   other   information
abcd
x
123
ID2   some   other   information
efgh
x
456

我试图通过使用文件 2 中的信息创建一个数组来在 awk 中解决此问题,但我不明白如何将其应用于文件中的下一行,因为我需要它:

awk 'NR==FNR{a[$1]=$2;next} $1 in a{<NEXT LINE>=a[$1]}1' file2 file1

我是新手,感谢任何帮助。

标签: awk

解决方案


awk 'FNR == NR{arr[$1]=$2;next} cur_val != ""{$1=cur_val; cur_val=""} arr[$1] != "" {cur_val=arr[$1]}{print}' file2 file1

好吧,让它更清晰一点,

#! /bin/bash

awk '{
    if (FNR == NR) {
        arr[$1]=$2
        next
    } 
    else
    if (cur_val != "") {
        $1=cur_val
        cur_val=""
    } 
    else
    if (arr[$1] != "") {
        cur_val=arr[$1]
    }
    print
}' file2 file1

推荐阅读