簡體   English   中英

僅保留唯一行,搜索整個目錄

[英]Keep unique lines only, searching entire directory

背景資料

在我的路由器上工作,因此只有60mb的可用內存。
我歡迎bash回答,但sh會讓我高興。
如果有執行此操作的二進制文件,我不介意將其編譯為在路由器上運行。

TL; DR

我有一個包含文本文件的目錄。

我如何確保在所有文件之間沒有重復的行?

例如,如果a.txtb.txtc.txt包含行apple ,則它應僅保留在其中一個行中(與哪個行無關)。

如果您想了解更多細節

我有一個腳本在dnsmasq使用的同一目錄中下載多個hosts文件。

我不想將所有文件合並為一個,但要保留所有文件以刪除重復的主機名。

例如,在

y.txt

127.0.0.1    google.com
127.0.0.1    yahoo.com

z.txt

0.0.0.0    apple.com
0.0.0.0    yahoo.com

包含域yahoo.com的行應從其中之一刪除。

如果此行還存在於另一個文件中,則也應從該文件中刪除該行。

我嘗試過的

1-將所有文件合並為一個,僅排序並保留唯一的行。
這里只有一個大文件不是理想的解決方案。

2-遍歷文件,將每個文件與其余文件進行比較。
將結果保存到臨時文件中,進行排序,刪除重復的行,最后重命名臨時文件以替換原始文件。
好像我在浪費資源。

你能試試這個awk嗎? 它不會替換在文件中。 它只是從所有文件中獲取第二列的唯一記錄

awk '!A[$NF]++' *.txt

您可以使用sed和臨時文件相當輕松地完成您嘗試做的事情。 只需將其中一個文件(例如z.txt )復制到臨時文件即可。 然后讀取另一個文件(例如y.txt )中的每一行,並將其分為iphost 然后調用sed -i在適當位置編輯臨時文件,刪除具有匹配$host名稱的任何行。 完成后,用臨時文件替換z.txt

例如:

cp -a z.txt z.tmp                   ## copy z.txt to temp file
while read -r ip host; do           ## read each line in y.txt
    sed -i "/.*$host/d" z.tmp       ## delete $host from temp
done < y.txt
mv -f z.tmp z.txt                   ## replace z.txt with temp

完成后:

$ cat z.txt
0.0.0.0    apple.com

可能還有其他幾種方法可以使用awk或僅使用grep來完成同一件事,但是grep需要讀取兩個文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM