Bash

在從源文件複製數據之前檢查目標文件是否有重複條目

  • October 19, 2017

我正在嘗試將行從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_ 中存在重複行時列印。

引用自:https://unix.stackexchange.com/questions/398195