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

(例: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

ファイルは内部で編集されるため、ファイルで実行する前にテストしてください。

関連情報