逐行比较2个文件,忽略比较时的最后一个单词,并提取仅在主文件

时间:2018-04-04 20:19:12

标签: bash shell

在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 =

1 个答案:

答案 0 :(得分:0)

当您awk时,您可以忘记revcut等。使用单线程可以实现与预期输出功能完全相同的结果:

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代码来帮助您获得所需的确切结果。

如果问题不明确,请询问,我会相应地编辑我的答案。