仅比较特定行上的 2 个文件
Compare 2 files on specific row only
我需要比较 2 个文件并找到匹配的行。
唯一的问题是我需要检查 DocumentList 文件中 5 行中的第 4 行,如果在最终文件中找到匹配项 return 整行。
cat DocumentList.xml
<?xml version="1.0" encoding="UTF-8" ?> <block-list:block-list xmlns:block-list="http://openoffice.org/2001/block-list">
<block-list:block block-list:abbreviated-name="adn" block-list:name="and" />
<block-list:block block-list:abbreviated-name="tesst" block-list:name="test" />
<block-list:block block-list:abbreviated-name="tust" block-list:name="test" />
<block-list:block block-list:abbreviated-name="seme" block-list:name="same"/>
第二个文件是:
cat final.txt
and
test
india
我可以使用此命令提取第四行,但不知道如何与最终文件中的行进行比较
awk -F '\"' '{print }' DocumentList.xml
预期结果:
<block-list:block block-list:abbreviated-name="adn" block-list:name="and" />
<block-list:block block-list:abbreviated-name="tesst" block-list:name="test" />
<block-list:block block-list:abbreviated-name="tust" block-list:name="test" />
我也尝试过类似的方法,但它没有 return DocumetList 文件中的整行。
awk -F '\"' 'FNR==NR {a[]; next} in a' DocumentList.xml final.txt
final.txt 文件为 1 GB,DocumentList 为 25 MB,两者都有 unicode 字符。
你可以试试,
search=$(awk 'BEGIN{OFS=ORS=""}{if(NR>1){print "|"}print ;}' final.txt)
# store 'and|test|india' in search variable
grep -E "block-list:name=\"($search)\"" DocumentList.xml
你明白了,
<block-list:block block-list:abbreviated-name="adn" block-list:name="and" />
<block-list:block block-list:abbreviated-name="tesst" block-list:name="test" />
<block-list:block block-list:abbreviated-name="tust" block-list:name="test" />
或使用 'awk'
awk 'BEGIN{FS="block-list:name=\""}
FNR==NR {a[]; next} {f=;gsub(/".*/,"",f)}
FNR>1 && f in a{print [=12=]}
' final.txt DocumentList.xml
注意:对于xml个文件,我不建议你这样做,最好使用xml-parser
只是调换读取文件的顺序:
awk -F '\"' 'FNR==NR {a[[=10=]]; next} in a' final.txt DocumentList.xml
输出:
<block-list:block block-list:abbreviated-name="adn" block-list:name="and" />
<block-list:block block-list:abbreviated-name="tesst" block-list:name="test" />
<block-list:block block-list:abbreviated-name="tust" block-list:name="test" />
使用您显示的示例,请尝试以下 awk
代码。在 GNU awk
.
中编写和测试
awk '
FNR==NR{
arr1[[=10=]]
next
}
match([=10=],/block-list:name="([^"]*)"/,arr2) && (arr2[1] in arr1)
' final.txt DocumentList.xml
解释: 在 awk
程序中读取名为 [=14= 的 Input_file(s) ] 和 DocumentList.xml
。然后在主程序中使用条件 FNR==NR
,当读取 final.txt 时将为 TRUE。在那个条件块中,我创建了一个名为 arr1 的数组,其索引是当前行,然后使用 next
将跳过从那里开始的所有进一步语句。然后我使用了 awk
的 match
函数,它匹配其中提到的正则表达式(block-list:name="([^"]*)"
)这匹配从 block-list:name=
到 "
直到下一次出现的所有内容"
记住 ()
创建值并将它们存储到名为 arr2
的数组中,稍后我们将访问该数组。然后使用 && (arr2[1] in arr1)
条件检查 arr2 的第一个元素的值是否出现在数组 arr1 中,然后打印该行(基本上匹配 final.txt 的值和 DocumentList.xml 所需的值)。
我需要比较 2 个文件并找到匹配的行。 唯一的问题是我需要检查 DocumentList 文件中 5 行中的第 4 行,如果在最终文件中找到匹配项 return 整行。
cat DocumentList.xml
<?xml version="1.0" encoding="UTF-8" ?> <block-list:block-list xmlns:block-list="http://openoffice.org/2001/block-list">
<block-list:block block-list:abbreviated-name="adn" block-list:name="and" />
<block-list:block block-list:abbreviated-name="tesst" block-list:name="test" />
<block-list:block block-list:abbreviated-name="tust" block-list:name="test" />
<block-list:block block-list:abbreviated-name="seme" block-list:name="same"/>
第二个文件是:
cat final.txt
and
test
india
我可以使用此命令提取第四行,但不知道如何与最终文件中的行进行比较
awk -F '\"' '{print }' DocumentList.xml
预期结果:
<block-list:block block-list:abbreviated-name="adn" block-list:name="and" />
<block-list:block block-list:abbreviated-name="tesst" block-list:name="test" />
<block-list:block block-list:abbreviated-name="tust" block-list:name="test" />
我也尝试过类似的方法,但它没有 return DocumetList 文件中的整行。
awk -F '\"' 'FNR==NR {a[]; next} in a' DocumentList.xml final.txt
final.txt 文件为 1 GB,DocumentList 为 25 MB,两者都有 unicode 字符。
你可以试试,
search=$(awk 'BEGIN{OFS=ORS=""}{if(NR>1){print "|"}print ;}' final.txt)
# store 'and|test|india' in search variable
grep -E "block-list:name=\"($search)\"" DocumentList.xml
你明白了,
<block-list:block block-list:abbreviated-name="adn" block-list:name="and" />
<block-list:block block-list:abbreviated-name="tesst" block-list:name="test" />
<block-list:block block-list:abbreviated-name="tust" block-list:name="test" />
或使用 'awk'
awk 'BEGIN{FS="block-list:name=\""}
FNR==NR {a[]; next} {f=;gsub(/".*/,"",f)}
FNR>1 && f in a{print [=12=]}
' final.txt DocumentList.xml
注意:对于xml个文件,我不建议你这样做,最好使用xml-parser
只是调换读取文件的顺序:
awk -F '\"' 'FNR==NR {a[[=10=]]; next} in a' final.txt DocumentList.xml
输出:
<block-list:block block-list:abbreviated-name="adn" block-list:name="and" />
<block-list:block block-list:abbreviated-name="tesst" block-list:name="test" />
<block-list:block block-list:abbreviated-name="tust" block-list:name="test" />
使用您显示的示例,请尝试以下 awk
代码。在 GNU awk
.
awk '
FNR==NR{
arr1[[=10=]]
next
}
match([=10=],/block-list:name="([^"]*)"/,arr2) && (arr2[1] in arr1)
' final.txt DocumentList.xml
解释: 在 awk
程序中读取名为 [=14= 的 Input_file(s) ] 和 DocumentList.xml
。然后在主程序中使用条件 FNR==NR
,当读取 final.txt 时将为 TRUE。在那个条件块中,我创建了一个名为 arr1 的数组,其索引是当前行,然后使用 next
将跳过从那里开始的所有进一步语句。然后我使用了 awk
的 match
函数,它匹配其中提到的正则表达式(block-list:name="([^"]*)"
)这匹配从 block-list:name=
到 "
直到下一次出现的所有内容"
记住 ()
创建值并将它们存储到名为 arr2
的数组中,稍后我们将访问该数组。然后使用 && (arr2[1] in arr1)
条件检查 arr2 的第一个元素的值是否出现在数组 arr1 中,然后打印该行(基本上匹配 final.txt 的值和 DocumentList.xml 所需的值)。