這是file1.txt:
.apple .ball .cow
.apple .cow .tea .mine.nice
.mine.nice
.tea
.zebra
這里file2.txt
.apple
.mine.nice
.cow
.tea
預期結果:
.apple .cow .tea .mine.nice
.mine.nice
.tea
雖然使用以下不會給出預期的結果
grep -w -F -f file2.txt file1.txt
給
.apple .ball .cow
.apple .cow .tea .mine.nice
.mine.nice
.tea
如何獲得預期的結果?
uj5u.com熱心網友回復:
我會AWK next按照以下方式利用 GNU 來完成這項任務,讓file1.txt內容成為
.apple .ball .cow
.apple .cow .tea .mine.nice
.mine.nice
.tea
.zebra
和file2.txt內容是
.apple
.mine.nice
.cow
.tea
然后
awk 'NR==FNR{arr[$1];next}{for(i=1;i<=NF;i =1){if(!($i in arr)){next}};print}' file2.txt file1.txt
給
.apple .cow .tea .mine.nice
.mine.nice
.tea
說明:在處理提到的第一個檔案期間(注意這是file2.txt),即行數等于當前檔案的行數(NR==FNR)詢問鍵是陣列的第一個檔案arr。這導致在陣列中創建鍵,我沒有指定任何值,它與未來無關。完成后轉到next行,即在處理第一個檔案期間不要做任何其他事情。對于使用回圈遍歷欄位的第一行以外的所有欄位for,如果遇到不是陣列鍵之一的欄位,則在按原樣處理所有欄位整行之后arr轉到行。請注意,此代碼短路,即一旦檢測到第一個不允許的單詞,就轉到下一行。免責宣告:我認為nextprintfile2.txt每行恰好保留 1 個字。
(在 gawk 4.2.1 中測驗)
uj5u.com熱心網友回復:
這可能對您有用(GNU sed):
sed -En '1{x;s/.*/cat file2/e;y/\n/ /;s/$/ /;x}
s/.*/& \n&/;G
:a;s/^(\S )(.*\n.*\n.*\1)/\2/;ta;s/^\n(.*)\n.*/\1/p' file1
該解決方案在模式空間中處理三行、當前行的兩個副本和 file2 的內容。當前行的第一個副本與 file2 中的字串匹配并減小大小,直到不再有匹配項。如果匹配結果產生一個空行,則匹配成功并列印該行,否則將其丟棄。處理流程如下:
用 file2 的內容填充保存空間,用空格替換換行符并附加一個空格以進行模式匹配。
將當前行加倍,再次為第一個副本添加一個空格,用換行符分隔副本并附加保留空間。
遍歷當前行第一個副本前面的字串,如果它在 file2 中匹配,則將其洗掉。
當沒有更多匹配時,如果只剩下分隔副本的換行符,則列印當前行的純正副本。
否則,當前行與 file2 中的字串不匹配,并且不會為該行生成任何輸出。
uj5u.com熱心網友回復:
我沒有想出比這里的awkorsed答案更簡單的替代方案,但認為值得解釋一下。(對不起,如果這不適合作為“答案”;我是新來的,還不能發表評論。)
您嘗試做的事情grep與設計做的事情根本不同,即查找包含任何匹配字串的所有行。您可以將grep命令鏈接在一起(例如,使用管道,|)以獲取包含所有字串的所有行,但查找僅包含一組特定子字串的行可能總是需要復雜的正則運算式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/451827.html
下一篇:期望if條件與ssh密碼
