选项1

选项1

我想根据这三个分隔符将 CSV 字段转换为三列:正斜杠、破折号和右括号:)/-

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

这是我需要看到的:

031  540  6622
021   886  3877
555   532   2662

实际上,我寻求一种简单快速的方法来转换以下模式:

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

然后将破折号分隔的字段转换为带有空格分隔符的三个字段。

答案1

使用 GNU sed。删除前导并将,和(替换为空格:-)/

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

输出:

031 5440 6622
021 8886 3877
555 532 2662

答案2

我想根据这三个分隔符将 CSV 字段转换为三列:正斜杠、破折号和右括号: )/-

awk可以设置FS这 3 个分隔符并获取 3 列并(从第一列中删除首字母:

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

答案3

选项1

如果您的数据始终包含带有任何分隔符的三个数字块,则应该这样做:

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

这会不是如果任何电话号码偏离三个区块,则可以正常工作。虽然不是您的要求之一,但由于它的运作方式,它也应该如果一行包含多个电话号码,或者一个电话号码跨多行,则有效 - 只要每个号码恰好包含三个块。

分解

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

提取连续的数字块,结果按每行一个块进行细分。

paste -d- - - -

展开数据,使每行出现 3 个块,并以连字符作为分隔符。

选项2

或者,如果您的数据不太一致:

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

分解

s/[^0-9]+/-/g用连字符替换任何非数字

s/^-//删除所有前导连字符

s/-$//删除所有尾随连字符

相关内容