簡體   English   中英

將txt文件與csv bash中的第三列進行比較

[英]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.

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