在 file1 中查找单词并复制下一个单词并替换 file2 中的脚本

Script to look for a word in file1 and copy the next word and replace that in file2

我有file1

(1'a lot of singapore 1.2.3.4 'some other info',0,null, 12345),

(2,'a lot of brazil  4.2.3.1, 'some other info',0,null, 12345),

(3,'a lot of india 3.4.2.1, 'some other info',0,null, 12345),

(4,'a lot of laos 1.3.4.5, 'some other info',0,null, 12345),

(5,'a lot of china 1.2.3.5, 'some other info',0,null, 12345);

file2

(1'a lot of singapore A.B.C.D 'some other info',0,null, 12345),

(2,'a lot of brazil E.F.G.H, 'some other info',0,null, 12345),

(3,'a lot of india H.I.J.K, 'some other info',0,null, 12345),

(4,'a lot of laos L.M.N.O, 'some other info',0,null, 12345),

(5,'a lot of china P.Q.R.S, 'some other info',0,null, 12345);

我创建了一个脚本,但要复制并替换为行号,但需要输入以在文件 1 中查找 SINGAPORE 并复制下一个单词 1.2.3.4 并在中查找 singapore file2 并替换 1.2.3.4 - A.B.C.D 中的下一个单词,最终的 file2 看起来像这样

(1'a lot of singapore 1.2.3.4 'some other info',0,null, 12345),

Python 脚本或 Awk 或 sed 任何脚本都会有帮助。

到目前为止,我已经创建了这个来复制和替换行号

sed -i '2d' File2.txt
awk 'NR==5380{a=[=13=]}NR==FNR{next}FNR==2{print a}1' file1.txt file2.txt

我不确定它是否有效,它是最好的解决方案,但你需要这样的东西。

import re

def try_to_get_country_data(line, country):
    line_parts = line.split(',')
    part_with_data = line_parts[1]
    
    if (match := re.search(f'.* {country} (.*)', part_with_data)) is not None:
        return match.group(1)
    
    return None
    
if __name__ == "__main__":
    found_data = None
    country = 'singapore'

    with open('some_file.txt', 'r') as f:
        for line in f:
            if (found_data := try_to_get_country_data(line, country)) is not None:
                break

    if found_data is not None:
        with open('second_file.txt', 'r') as f2:
            data = f2.readlines()

        for i, line in enumerate(data):
            if (replaced_data := try_to_get_country_data(line, country)) is not None:
                data[i] = line.replace(replaced_data, found_data)
                break

        with open('second_file.txt', 'w') as f2:
            f2.writelines(data)

所以,我已经检查过了,如果每一行的线条模式相同,它就可以工作。

如果您想要一个简短的 bash 脚本并假设文件的结构是不变的,您可以尝试这样的事情:

country="singapore"
a=$(grep "${country}" file0 | awk '{print }')

if [[ "${a}" ]]
then
    b=$(grep -w "${country}" file1 | awk '{print }')
    sed "s/${country} ${b}/${country} ${a}/g" file1
fi

在脚本的输出下方找到:

(1'a lot of singapore 1.2.3.4 'some other info',0,null, 12345),

(2,'a lot of brazil E.F.G.H, 'some other info',0,null, 12345),

(3,'a lot of india H.I.J.K, 'some other info',0,null, 12345),

(4,'a lot of laos L.M.N.O, 'some other info',0,null, 12345),

(5,'a lot of china P.Q.R.S, 'some other info',0,null, 12345);

使用 sed -i 以便就地编辑 file1

为了避免多次读取同一个文件而降低一点可读性,最初的做法可以很容易地重构如下:

country="singapore"
file0c=$(cat file0)
file1c=$(cat file1)

a=$(echo "${file1c}" | grep -w "${country}" | awk '{print }')

if [[ "${a}" ]]
then
    b=$(echo "${file1c}" | grep -w "${country}" | awk '{print }')
    echo "${file1c}" | sed "s/${country} ${b}/${country} ${a}/g" | 
    tee file1_new
fi

这是一个简单的 Awk 脚本,用于从第一个输入文件中查找替换文本并替换第二个输入文件中的相应标记。

awk -v country="singapore" 'NR == FNR {
    for (i=2; i<=NF; i++) if ($(i-1) == country) token = $i; next }
  [=10=] ~ country { for(i=2; i<=NF; i++) if ($(i-1) == country) $i = token
    } 1' file1 file2 >newfile2

当我们阅读file1时,NR == FNR为真。我们遍历输入标记并检查匹配 country 的标记;如果我们找到一个,我们将 token 设置为该值。这意味着如果 country 关键字有多个匹配项,将提取第一个输入文件中的最后一个。

next 语句导致 Awk 跳过此输入文件的其余脚本,因此仅读取来自 file1 的行,而不会进一步处理。

如果我们读到最后一行,我们现在正在阅读 file2。如果我们看到包含关键字的行,我们将在 country 关键字之后对关键字执行替换。 (这要求关键字是一个独立的标记,而不是一个较长单词中的子串等)最后的 1 导致所有到达这里的行被打印回标准输出,从而生成第二个的副本执行任何替换的文件。

如果您对此处使用的数据格式有任何控制,或许可以尝试找出一种方法,以一种不太随意的 ad-hoc 格式获取输入,例如 JSON.