根據上一個命令中的變量,使用 awk 或 sed 從檔案中刪除行

根據上一個命令中的變量,使用 awk 或 sed 從檔案中刪除行

我有一個包含字串和數字的 CSV 檔案(例如 temp.csv)。我需要刪除文件中行開頭包含特定字串模式的行。例如,這是我的文件 -

req1,incl_patt1,excl_patt1,2,ind1
req1,incl_patt2,excl_patt2,1,ind1
req1,incl_patt3,excl_patt3,4,ind1
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4

我正在req_file_curr命令中 寫入一個模式~ $ req_file_curr=req1

echo "${req_file_curr}"給出輸出為req1

然而,當在一個sed命令,如下圖所示:

sed '/\"${req_file_curr}\"/d' temp.csv

給出輸出為

req1,incl_patt1,excl_patt1,2,ind1
req1,incl_patt2,excl_patt2,1,ind1
req1,incl_patt3,excl_patt3,4,ind1
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4

我期望輸出為

req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4

如何使用 shell 中的變數作為模式來查找sed或者awk

答案1

您需要將sed模式用雙引號括起來,以便 shell 可以在將變數傳遞給之前展開變數sed

sed "/^${req_file}/d" temp.csv

您還需要使用^錨點來指示sed此模式需要出現在行的開頭。

答案2

不需要awksed這裡:

grep -v "^$req_file_curr," file

請注意(如 forsedawk雖然在較小程度上),假設$req_file_curr不包含正則表達式運算符(如., *...)。

如果是這樣,您必須轉義這些字符,或者使用awk,您可以使用使用其index()函數的方法:

S="$req_file_curr," awk 'index($0, ENVIRON["S"]) != 1' < file

答案3

您已設定req_file_curr但使用req_file.並且您的sed命令將不起作用,因為 shell 變數無法在您的sed命令中擴展。

你可以試試這個:

$ sed '/'"${req_file_curr}"'/d' file
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4

或使用sed雙引號:

sed "/${req_file_curr}/d" file

並使用awk

$ awk -v req=$req_file_curr '$0 !~ req' file
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4

答案4

ed 解決方案就像這樣。

  req_file_curr=req1

  printf '%s\n' "g/^$req_file_curr/d"  w | ed -s temp.csv

它會就地編輯文件,因此在針對您的文件執行此操作之前請先進行測試。

相關內容