[英]Comparing txt file to third column in a csv bash
我是編程新手並決定學習bash,因為我們處理一些基於Linux / Unix的日志服務器,因此腳本編寫更容易一些。
我有一個cvs文件,其布局如下:
PC,用戶,文件,路徑 - 所有逗號分隔。
我有一個行分隔的文件名白名單。 有些包括空間。
我的目標是將白名單與csv文件的第3列進行比較,並輸出所有不匹配的行。 我嘗試了一個帶有if語句的while循環,但似乎無法讓它工作。 我做了一些awk一個襯墊,實際上從過去的stackoverflow帖子中得到一個輸出與白名單相匹配的行,但我似乎無法弄清楚如何反轉邏輯以使其工作。 代碼如下。
awk 'BEGIN{i=0}
FNR==NR { a[i++]=$1; next }
{ for(j=0; j<i; j++)
if(index($0,a[j]))
{print $0;break}
}' $whitelist $exestartup
我想堅持使用沒有附加組件的基本bash,而不是反對做一個循環/ if語句而不是一個awk單行。
樣本輸入/輸出:
whitelist.txt
Program.exe文件
超級program.exe
可能-的Program.exe
exestartup.csv
Asset1,用戶1,potato.exe,C:\\用戶\\ USER1
Asset2,用戶2,Program.exe文件C:\\用戶\\用戶2
Asset3,用戶3,可能-的Program.exe,C:\\用戶\\用戶3
Asset4,user4,super program.exe,c:\\ users \\ user4
產量
Asset1,用戶1,potato.exe,C:\\用戶\\ USER1
awk
來救援!
awk -F, 'FNR==NR{a[$1]; next} !($3 in a)' whitelist exestartup
將字段分隔符設置為逗號。 加載所有白名單名稱,並與文件的$ 3字段進行比較,如果不匹配; 打印。
如果您發布樣本輸入和預期輸出,您將獲得更多答案,也許更好的建議。
使用您的輸入文件
$ awk -F, 'FNR==NR{a[$1]; next} !($3 in a)' whitelist.txt exestartup.csv
Asset1,user1,potato.exe,c:\users\user1
如果您的awk
被破壞且字段值不相交,您可以恢復為grep
$ grep -vf whitelist.txt exestartup.csv
Asset1,user1,potato.exe,c:\users\user1
使用join
:
$ join -v 1 -t, -1 3 -2 1 -o 1.1,1.2,1.3,1.4 <(sort -t, -k3,3 exestartup.csv) <(sort whitelist.txt)
Asset1,user1,potato.exe,c:\users\user1
如果輸入文件已經在匹配的鍵上排序(它們似乎不在您的示例中),那可能只是:
$ join -v 1 -t, -1 3 -2 1 -o 1.1,1.2,1.3,1.4 exestartup.csv whitelist.txt
此解決方案僅使用Bash 3內置:
IFS=$'\n' read -d '' -r -a whitefiles < whitelist.txt
while IFS= read -r csvline || [[ -n $csvline ]] ; do
IFS=, read pc user file path <<< "$csvline"
for wfile in "${whitefiles[@]}" ; do
[[ $wfile == "$file" ]] && continue 2
done
printf '%s\n' "$csvline"
done < exestartup.csv
可以在Bash 4中實現更快更清潔的解決方案,因為它具有關聯數組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.