如果符合条件,则将文件的一行替换为第二个文件中的另一行
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
我想把回声部分也声明成一个变量,它可能看起来更干净,更容易处理。这个脚本还有一些其他问题,但到目前为止我认为主要问题已经解决了。
我想知道我是否可以阅读 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
我想把回声部分也声明成一个变量,它可能看起来更干净,更容易处理。这个脚本还有一些其他问题,但到目前为止我认为主要问题已经解决了。