たとえば、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} は
pat
in をin
何も置換しません。$
最初の変数/部分(in)と比較して、pat varを変数としてマークする必要があります。