
檔案由腳本使用輸入檔修改 -
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]
,還有另一個逗號)。
換句話說,這會找到不符合預期條件的行。!
如果您想要火柴,請取出。