オプション1

オプション1

スラッシュ、ダッシュ、閉じ括弧など、3つの区切り文字に基づいてCSVフィールドを3つの列に変換したいと思います。)/-

(031)540-6622
021-886-3877
555/532-2662

これは私が見なければならないでしょう:

031  540  6622
021   886  3877
555   532   2662

実際、私は次のスキーマを変換する簡単で迅速な方法を探しています。

(###)###-####       \
###-###-####         |---> ###-###-####
###/###-####        /

次に、ダッシュで区切られたフィールドをスペース区切り文字を含む3つのフィールドに変換します。

答え1

GNU sedを使用してください。先行を削除し(、 を空白に置き換えます。-)/

sed 's/^(//; y|-)/|   |' file

出力:

031 5440 6622
021 8886 3877
555532 2662

答え2

スラッシュ、ダッシュ、閉じ括弧など、3つの区切り文字に基づいてCSVフィールドを3つの列に変換したいと思います。 )/-

awk次の3つの区切り文字を設定FSし、3つの列を取得して(最初の列から最初の文字を削除できます。

awk -v FS='[)-/]' '{gsub(/^\(/,"",$1);print $1,$2,$3}' file
031 540 6622
021 886 3877
555 532 2662

答え3

オプション1

データに常に区切り文字がある3つの数値ブロックが含まれている場合は、次のことを行う必要があります。

grep -Eo "[0-9]+" phone.txt \
  | paste -d- - - -

これはいいえ電話番号が3ブロック離れていると正しく機能します。あなたの要件の1つではありませんが、どのように機能するかしなければならないこれは、1行に複数の電話番号が含まれている場合、または電話番号が複数行にまたがる場合(各番号に正確に3つのブロックが含まれている限り)に機能します。

崩れる

grep -Eo "[0-9]+" phone.txt

連続した数値ブロックが抽出され、結果は行ごとに1つのブロックに分類されます。

paste -d- - - -

各行がハイフンで区切られた3つのブロックとして表示されるようにデータを拡張します。

オプション2

またはデータの一貫性が低下した場合:

sed -r 's/[^0-9]+/-/g;s/^-//;s/-$//' phone.txt

崩れる

s/[^0-9]+/-/g数字以外の数字はハイフンに置き換えてください。

s/^-//すべての先行ハイフンを削除

s/-$//末尾のハイフンを削除します。

関連情報