Bash
在從源文件複製數據之前檢查目標文件是否有重複條目
我正在嘗試將行從source.txt複製到target.txt。如果在複製之前有重複的條目,我希望這個
bash
腳本檢查target.txt上的每一行。source.txt包含:
a$$a$$a b**b** c%%cc%% d##d##d## e^^e^^e^^
target.txt包含:
a$$a$$a ee$$ee$$ ff__ff__ gg@@gg@@ zzxxzzxx bb..bb..bb e^^e^^e^^ hh;;hh;;hh
在這種情況下,我假設只有 3 個條目將被複製到target.txt ,它們是:
b**b** c%%cc%% d##d##d##
我的測試程式碼是:
#!/bin/bash echo "started" programpath=/home/mysite/www/copyfiles var str input ; cat "$programpath/source.txt" > $input var str target ; cat "$programpath/target.txt" > $target cat $input >> $target uniq -u "$target" echo "finished" exit 1 fi
為什麼使用
bash
?該grep
命令可以完成這項工作。grep -Fxvf target.txt source.txt #>> target.txt
這將返回僅存在於source.txt中的那些行,然後您可以將這些行附加到您的 target.txt中,只需取消註釋即可
#>> target.txt
。您之前可能還需要對source.txt進行唯一化,以防止在source.txt文件中附加重複的條目,這
awk
在接下來也會執行相同的操作。grep -Fxvf target.txt <(sort -u source.txt) #>> target.txt
- 該
-F
選項grep
將匹配模式告知為字元串而不是正則表達式。- 有了
-x
選項,我們告訴整條線是我的模式。- 這
-v
是反向匹配,如果您錯過它,它將輸出兩個文件中都存在的行。- 並
-f
告訴grep
從這裡的文件中讀取我的模式target.txt
。或者你可以
awk
改用。awk 'NR==FNR{seen[$0]=1;next} !seen[$0]++' target.txt source.txt #>> target.txt
- 將整個target.txt文件添加到
seen
使用整行鍵呼叫的數組中seen[$0]
,然後next
讀取下一行。!seen[$0]++
我們正在從 source.txt 中查找數組中不存在的一行,然後列印它。還將 source.txt文件行添加到數組中,以防止在 source.txt_ 中存在重複行時列印。