在shell脚本中,我试图逐行比较两个文件,忽略每行中的最后一个单词。
如果文件A中存在一行但不存在于B中,我想将整行从文件A添加到文件B的末尾。
到目前为止,它将输出我想要的内容,但不包括匹配行中的最后一个单词。
当前脚本:
#!/bin/bash
rev settings.py | cut -d' ' -f2- | rev > settings.tmp
rev settings_template.py | cut -d' ' -f2- | rev > settings_template.tmp
awk 'NR==FNR{a[$0];next}(!($0 in a)){print}' settings.tmp settings_template.tmp > diffs.tmp
if [ -f "diffs.tmp" ]
then
printf "\n" >> settings.py
cat diffs.tmp >> settings.py
fi
rm *.tmp
settings.py(预脚本执行):
# Comment about hosts
HOSTS = 1
# Debug settings - only enable True for debugging issues
# Default = False
DEBUG = False
settings_template.py:
# Comment about hosts
HOSTS = 1
# Debug settings - only enable True for debugging issues
# Default = False
DEBUG = False
# Enable auto-checking for an update
# If set to True, xyz
# Default = True
CHECK_FOR_UDPATES = True
settings.py(发布脚本后执行):
# Comment about hosts
HOSTS = 1
# Debug settings - only enable True for debugging issues
# Default = False
DEBUG = False
# Enable auto-checking for an
# If set to True,
# Default =
CHECK_FOR_UDPATES =
答案 0 :(得分:0)
当您awk
时,您可以忘记rev
,cut
等。使用单线程可以实现与预期输出功能完全相同的结果:
awk '{b=$0;$NF=""}!($0 in a){print b}NR==FNR{a[$0]}' \
settings.py settings_template.py >settings.py.new
mv settings.py.new settings.py
诀窍是$NF=""
删除了一行的最后一个单词(我已经保存在b
中),并且删除$0
,然后可以将其用于比较。< / p>
<强> settings.py.new 强>
# Comment about hosts
HOSTS = 1
# Debug settings - only enable True for debugging issues
# Default = False
DEBUG = False
# Enable auto-checking for an update
# If set to True, xyz
CHECK_FOR_UDPATES = True
问题在于,通过这种方式,第一个之后的所有空行都不会被打印,因为a
中已经注册了一个空行。如果这是不可接受的,只需在某处添加规则!$0{print}
即可打印两个文件中的所有空行。此外,# Default = False
不会重复,根据您的规格,它不应该重复。
整个概念不是很强大。如果在两个文件中都有单词注释的行怎么办?第二个将被跳过,即使它是不同的......
YMMV,但我会保留第一个文件中的所有空行和注释,并从第二个文件中仅打印非空的非注释行,这样:
awk '{b=$0;$NF=""}NR==FNR{a[$0];print b;next}/^#/||!$0{next}!($0 in a){print b}' \
settings.py settings_template.py > settings.py.new
在这种情况下,
<强> settings.py.new 强>
# Comment about hosts
HOSTS = 1
# Debug settings - only enable True for debugging issues
# Default = False
DEBUG = False
CHECK_FOR_UDPATES = True
我希望我已经展示了足够的awk代码来帮助您获得所需的确切结果。
如果问题不明确,请询问,我会相应地编辑我的答案。