文字列と数字を含む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
シェルの変数をパターンとして使用する方法sed
またはawk
?
答え1
sed
シェルが変数を渡す前に変数を拡張できるように、パターンを二重引用符で囲む必要がありますsed
。
sed "/^${req_file}/d" temp.csv
また、このパターンが線の先頭に表示されることを^
示すためにアンカーポイントを使用する必要があります。sed
答え2
必要なしawk
またはsed
ここ:
grep -v "^$req_file_curr," file
(例:forsed
または精度は低いですが)正規表現演算子(たとえば、...)が含まれていないとしますawk
。$req_file_curr
.
*
その場合は、これらの文字をエスケープする必要があるか、またはその機能を使用するメソッドをawk
使用できます。index()
S="$req_file_curr," awk 'index($0, ENVIRON["S"]) != 1' < file
答え3
設定しましたが、req_file_curr
コマンドを使用するとシェル変数を拡張できないため、req_file
コマンドsed
は機能しません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
ファイルは内部で編集されるため、ファイルで実行する前にテストしてください。