前のコマンドの変数に基づいて 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

シェルの変数をパターンとして使用して検索するにはどうすればいいですか?sedまたはawk?

答え1

sedシェルが変数を渡す前に展開できるように、パターンを二重引用符で囲む必要がありますsed

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

また、このパターンが行の先頭に出現する必要があること^を示すために、アンカーを使用する必要があります。sed

答え2

awkここでは または は必要ありませんsed:

grep -v "^$req_file_curr," file

ただし、(sedawkと同様に、程度は低いものの) は に正規表現演算子 ( 、...$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

ファイルはその場で編集されるので、ファイルに対して実行する前にまずテストしてください。

関連情報