我必須從一個檔案中讀取 id 并在第二個 xml 檔案中搜索它,如果找到將整行寫入第三個檔案。檔案 1 為 111 MB,檔案 2 為 40 GB
檔案1.xml
id1
id2
id5
檔案2.xml
<employees>
<employee><id>id1</id><name>test1</name></employee>
<employee><id>id2</id><name>test2</name></employee>
<employee><id>id3</id><name>test3</name></employee>
<employee><id>id4</id><name>test4</name></employee>
<employee><id>id5</id><name>test5</name></employee>
<employee><id>id6</id><name>test6</name></employee>
</employees>
File3.xml:結果
<employee><id>id1</id><name>test1</name></employee>
<employee><id>id2</id><name>test2</name></employee>
<employee><id>id5</id><name>test5</name></employee>
我用 grep 試過了
grep -i -f file1.xml file2.xml >> file3.xml
但它給記憶體耗盡錯誤。
我嘗試使用回圈和 awk 命令的另一種方法。
#while read -r id;do
#awk -v pat="$id" '$0~pat' file2.xml >> file3.xml
#done < file1.xml
它也花費了太多時間。什么可能是最好的最佳解決方案。
uj5u.com熱心網友回復:
使用您顯示的示例,請嘗試以下awk代碼。用 GNU 撰寫和測驗awk。
awk -v FPAT='<id>[^<]*</id>' '
FNR==NR{
arr["<id>"$0"</id>"]
next
}
($1 in arr)
' file1.xml file2.xml
說明:為上述添加詳細說明。
awk -v FPAT='<id>[^<]*</id>' ' ##Starting awk program and setting FPAT to <id>[^<]*<\\/id>
FNR==NR{ ##Checking condition which will be TRUE when file1.xml is being read.
arr["<id>"$0"</id>"] ##Creating an array arr which has index of <id> $0 </id> here.
next ##next will skip all further statements from here.
}
($1 in arr) ##Checking condition if $1 is present in arr then print that line.
' file1.xml file2.xml ##Mentioning Input_file names here.
uj5u.com熱心網友回復:
這應該適用于任何 awk 版本:
awk 'FNR == NR {
seen["<id>" $1 "</id>"]
next
}
match($0, /<id>[^<]*<\/id>/) && substr($0, RSTART, RLENGTH) in seen
' file1 file2
<employee><id>id1</id><name>test1</name></employee>
<employee><id>id2</id><name>test2</name></employee>
<employee><id>id5</id><name>test5</name></employee>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/452542.html
