如果符合条件,则将文件的一行替换为第二个文件中的另一行

Replace one line of a file with another line in a second file if it matches the condition

我想知道我是否可以阅读 a.txt 的每一行并将其与 b.txt 中的每一行进行比较。如果 a.txt 中的任何行与 b.txt 中行的开头部分匹配,我们将匹配的行替换为我们在 a.txt 中找到的行。因此,假设有两行:alias cd /correct/path/alias cd /wrong/path/sth 分别位于 a.txt b.txt 中。现在,在我执行我的命令后,我希望两个文件上的行都像:alias cd /correct/path/。我自己的解决办法是做两个while...read..函数,用sed -i ///替换行,但是我觉得很笨拙,效率不高。我希望通过更干净高效的解决方案得到启发。这是我的代码,如果有帮助的话:

awk 'NR==FNR { array[[=10=]]; next } { delete array[[=10=]] } END{for (key in array) { print key } }' a.txt b.txt > tmp
input="tmp"
while IFS= read -r line
do
    echo "$line"
    cat b.txt > n_tmp
    n_input="$n_tmp"
    while IFS= read -r n_line
    do
        if $n_line | awk '{print , }' == $line | awk '{print , }'; then
            sed -i "s/$n_line/$line/" b.txt
        fi
    done < "$n_input"
    rm -rf n_tmp
done  < "$input"
rm -rf tmp```

此脚本中有一些错误,大部分错误在行内:if $n_line | awk '{print , }' == $line | awk '{print , }'; then。首先,从 $n_line | awk '{print , }' 获取结果的方法是错误的,因为 n_line 变量没有任何操作。需要添加一个 echo 这样我们就可以得到字符串的输出,并且 awk 命令可以跟进。其次,没有双引号 用于字符串或我试图从 $n_line | awk '{print , }' 命令获得的任何内容。最后,需要一个双括号 来环绕比较器的两侧。所以最后它应该看起来像这样:

b_string=`echo "$n_line" | awk '{print , }'`
if [[ "$a_string" == "$b_string" ]]; then

我想把回声部分也声明成一个变量,它可能看起来更干净,更容易处理。这个脚本还有一些其他问题,但到目前为止我认为主要问题已经解决了。