awkを使用して一意の文字のみを残し、別のテキスト文字列から1つのテキスト文字列を減算します。

awkを使用して一意の文字のみを残し、別のテキスト文字列から1つのテキスト文字列を減算します。

たとえば、awkを使用しているように、テキストを含む別の列からテキストを含むデータ列を減算して、一意の文字を含む3番目の列を取得する方法はありますか?

入力する

ab   a
cd   d    
efg  ef

希望の出力:

ab   a   b
cd   d   c
efg  ef  g

答え1

はい、awk適切な選択です。

awk 'NF{t=$1;gsub("["$2"]","",t);print$0,t}' input

2番目のフィールドに正規表現の文字クラスの特別な意味を持つ文字を含めることができる場合は、その文字をエスケープする必要があります。 POSIXでこの問題を解決するのにawk時間がかかるので、GNUの代替案を公開しますawk

gawk 'NF{print$0,gensub("["gensub(/([\[\]^-])/,"\\\\\\1","g",$2)"]","","g",$1)}' input

答え2

Manatworksのソリューションは間違いなく問題ではありません。これは純粋なbashの代わりです。

while read line
do
  in=${line/ */}
  pat=${line/* /}
  echo $line ${in/$pat}
done < aba.dat

ab a b
cd d c
efg ef g
  • in$line の置換( ) では、/空白の後には正規表現ではなくワイルドカードスタイルが続きます。
  • 反対pat:空白の前の内容を削除します。 ${src/pattern/replacement}の代替部分が空なので削除します。
  • ${in/$pat} はpatin をin何も置換しません。$最初の変数/部分(in)と比較して、pat varを変数としてマークする必要があります。

関連情報