文字列と数字を含む 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
ただし、(sed
や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
ファイルはその場で編集されるので、ファイルに対して実行する前にまずテストしてください。