我想根据这三个分隔符将 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/-$//
删除所有尾随连字符