特定の列から単語(文字の後にスペース)を削除する

特定の列から単語(文字の後にスペース)を削除する

次の形式のファイルがあります。

cat dog AHF123432 | 123432 | dhfshfjdh
lion  AFG23412 |23412 | dfshjhfjdhj

最初の列から文字のみを含む単語(たとえば、最初の行の猫(後ろのスペース)と犬、2番目の行のライオン)を削除する必要があります。

私の結果は次のようになります。

AHF123432 | 123432 |  dhfshfjdh    
AFG23412 | 23412 | dhfshfjdh

答え1

これにより、行の先頭のすべてのアルファベットの単語が削除されます。

$ sed -r 's/^([[:alpha:]]* )*//' filename.tsv
AHF123432 | 123432 | dhfshfjdh
AFG23412 |23412 | dfshjhfjdhj

または、出力を新しいファイルに保存します。

sed -r 's/^([[:alpha:]]* )*//' filename.tsv > final.tsv

どのように動作しますか?

  • [[:alpha:]]*スペースが続く任意の数のアルファベット文字と一致します。言い換えれば、単語の後にスペースが続くのと一致します。

    詳しくは、[[:alpha:]]単一のアルファベット文字と一致します。 「[[:alpha:]] *」はこれらの文字の数と一致します。

  • ([[:alpha:]]* )*スペースが続くこれらの単語の数と一致します。

  • ^([[:alpha:]]* )*スペースは後続のランダムな数の単語と一致しますが、行^の先頭でのみ始まります。

  • 置換コマンドは、一致するすべての単語を削除します。置換コマンドの形式s/old/new/は次のとおりです。old上記の式は、行の先頭から始まり、任意の数の単語に一致します。この単語を空の文字列に置き換えたいので、ここでは空の文字列を使用しますnew

過去には、アルファベット文字マッチングのための正規表現はありました[a-zA-Z]。最新のUnicodeフォントでは、これはより安定しています。上記で使用した正規表現は[:alpha:]Unicodeに安全であるためです。

答え2

erl互換正規表現をgrepサポートする場合:pcre

grep -Po '^([a-z]* +)*\K.*'

または

pcregrep -o '^([a-z]* +)*\K.*'

答え3

使用awk

awk -F'|' '{for (i=1; i<=NF;i++) {gsub(/([a-z]|[A-Z])+ /,"",$i); printf "%s",$i; if(i<NF) {printf "|"} else { printf "\n"}}}' foo

はい

% cat foo
cat dog AHF123432 | 123432 | dhfshfjdh
lion AFG23412 | 23412 | dfshjhfjdh

% awk -F'|' '{for (i=1; i<=NF;i++) {gsub(/([a-z]|[A-Z])+ /,"",$i); printf "%s",$i; if(i<NF) {printf "|"} else { printf "\n"}}}' foo
AHF123432 | 123432 | dhfshfjdh
AFG23412 | 23412 | dfshjhfjdh

関連情報