我有一个文件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
) 分隔。