Grep 檔案中的變數

Grep 檔案中的變數

檔案由腳本使用輸入檔修改 -

141,141_1,酒吧,本田,ps2_0,未分配,ps3_0,未分配,ps4_0,未分配,ps5_0,未分配,ps6_0,未分配,ps7_3,直到威爾,.....

輸入檔-

141、PS7,蒂爾威爾

現在我需要搜尋 ps7_3 列是否已更新為正確的值。

因此,我從輸入文件中分離了列 -

while read -r line;
do
sub1=$(echo $line|cut -f 1 -d ',');
sub2=$(echo $line|cut -f 2 -d ',');
sub3=$(echo $line|cut -f 3 -d ',');
sub4=$(echo $sub2'.*,'$sub3|sed -e "s/\(.*\)\r/'\1'/");
echo $sub1;
echo $sub2;
echo $sub3;
echo $sub4;
grep $sub4 modded_file.csv.dat;
done<input.csv

輸出是-

141
ps7
TILL WILL
'ps7.*,TILL WILL'
grep: WILL': No such file or directory

但當我跑步時 grep 'ps7.*,TILL WILL' modded_file.csv.dat,它起作用了。如何在檔案中 grep 一個如上所示的變數?

答案1

如您從輸入中看到的,變數 sub4 中有空格符號,因此重寫此行:

grep $sub4 modded_file.csv.dat;

成為

grep -- "$sub4" modded_file.csv.dat;

(@philippos 補充) 並且$sub4不應包含單引號',因為它們將被視為搜尋模式的一部分。

我認為您的誤解是如何執行引用和擴展的順序:您認為首先將擴展變量,然後執行引用,因此擴展後變量的單引號將引用字串。但實際上引用是在變數擴展之前完成的,所以你需要引用$sub

答案2

grep在循環內運作是一個巨大的反模式。試試這個吧。

awk -F "," 'NR==FNR { key[$1]=$2; value[$1]=$3; next }
    ($1 in key) && ($0 !~ "^" $1 ",.*," key[$1] "," value[$1] ",")' input.csv modded_file.csv.dat

我沒有試圖理解為什麼你想要或期望\r在那裡以某種方式所以這可能需要一些調整。

Awk 腳本由一系列 *條件{操作對組成},這些操作對依序應用於每個輸入行。您可以使用next跳過此輸入行的剩餘腳本並跳到下一個輸入,並且可以省略{行動}如果您只想列印整個輸入行。 (您也可以省略狀態 如果您想無條件地執行某些操作。 )每一行都分為字段,這些字段在腳本中可用作 、 等 $1。將欄位分隔符號設定為逗號(預設為空格序列)。$2-F ","

NR==FNR習慣用法是在 Awk 中處理兩個輸入檔的常見方法。當您處理第一個輸入檔時,總行號NR將等於檔案內的行號,隨後為 false。FNR

當我們讀取第一個檔案時,我們將欄位儲存在兩個關聯數組中,兩個陣列都以第一個欄位為鍵。

當我們讀取第二個檔案時,我們列印在數組中找到鍵的每個輸入行key,並且整行與預期的正則表達式不匹配(第一個字段是鍵,後跟任何內容,後跟逗號,列我們儲存在中的名稱key[$1],另一個逗號,我們儲存在 中的預期值value[$1],還有另一個逗號)。

換句話說,這會找到不符合預期條件的行。!如果您想要火柴,請取出。

相關內容