如何在 fileA 上查找字符串,从该字符串中选择一些文本并替换 fileB 上的字符串?

如何在 fileA 上查找字符串,从该字符串中选择一些文本并替换 fileB 上的字符串?

我有一个文件A和一个文件B。在文件A,我希望我的脚本能够找到特定的 stringA;然后,使用sed命令仅将 stringA 的一部分粘贴到文件B(替换为特定 stringB 的一部分文件B)。

例如。

文件A
阿什吉卡赫斯德
阿斯吉克达吉德
推荐重量:0.546(这是感兴趣的字符串)

文件B
阿斯达吉斯克达
克贾什贾赫斯德
工作组HT      0.495(这是FILE BI需要替换的部分)

我只想选择 stringA 的文本 (0.546) 并将 fileB 上的 0.495 替换为 0.546,因此,新的 fileB 将是:

新文件B
阿斯达吉斯克达
克贾什贾赫斯德
重量 0.546

仅使用sed对我来说不起作用,因为它会在同一文件中用 stringB 替换 stringA ,但我的 stringsA 和 B 来自不同的文件。此外,它们是“随机”生成的(通过程序)。

答案1

您实际上可以使用sed(以及另一个匹配第一个文件的工具)来完成此操作。例如:

$ sed -E "s/(WGHT\s*).*/\1$(grep -oP 'Recommended Weight: \K[0-9.]+' fileA)/" fileB 
asdajskdha
kjashdjahsd
WGHT 0.546

或者先将其保存在变量中:

$ wght=$(sed -En 's/Recommended Weight: *([0-9.]+)/\1/p' fileA)
$ sed -E "s/(WGHT\s*).*/\1$wght/" fileB
asdajskdha
kjashdjahsd
WGHT 0.546 

答案2

awk 'FNR==NR && $2 == "Weight:"{ weights[spotted++]=$3} FNR!=NR && $1 != "WGHT" { print } FNR!=NR && $1=="WGHT" { print "WGHT", weights[replaced++]} ' in1 in2 > out2

这将创建一个新文件,out2其中包含您想要的输出数据。然后您可以将其移动到任何您想要的位置。

$ cat out2
asdajskdha
kjashdjahsd
WGHT 0.546

答案3

该脚本创建new_file_b.txt.

用法: ./script.sh file_a.txt file_b.txt > new_file_b.txt

#!/bin/bash

awk '
/Recommended Weight: /{
    value=$3;
}
NR != FNR {
    if($1 == "WGHT") {
        print $1 OFS value; 
    } else {
        print;
    }
}
' "$1" "$2"

答案4

您可以按GNU sed如下方式进行:

sed -Ez '
   N;s/.*\nRecommended Weight: (\S+)\n.*\x00(.*\nWGHT[[:blank:]]+)\S+\n/\2\1\n/
' fileA fileB

如果该-E选项打开,extended regex facility则该-z选项将每个文件视为单个字符串,并且多个文件以 null( \0) 分隔。

相关内容