我有一个包含逗号分隔的以下记录的文件:
143849998,+4564656
6345353,000345345
754656,0345345
64555546,3453452345
要求是为每条记录中的每个第2个字段添加一定的前缀。前缀在不同条件下是不同的。逻辑是:
输出应该是这样的:
143849998,+4564656
6345353,+345345
754656,+345345
64555546,+2343453452345
如何使用AWK实现这一目标?我能够执行最后一个条件,第一个条件是直接的,但是当我试图在一个awk命令中使用所有条件时,我失败了。
答案 0 :(得分:4)
此行应该
awk -F, -v OFS="," '$2!~/^\+/{if(!sub(/^0+/,"+",$2))$2="+234"$2}7' file
143849998,+4564656
6345353,+345345
754656,+345345
64555546,+2343453452345
或者也可能是这样:
awk -F, -v OFS="," '$2!~/^\+/&&!sub(/^0+/,"+",$2){$2="+234"$2}7' file
答案 1 :(得分:2)
使用sed
:
sed 's|,\([1-9]\)|,+234\1|; s|,0\+|,+|' file
awk
中的同义词:
awk '{ sub(/,([1-9])/, ",+234\1"); sub(/,0+/, ",+") } 1' file
输出:
143849998,+4564656
6345353,+345345
754656,+345345
64555546,+2343453452345
答案 2 :(得分:2)
$ awk -F, '{print $1",+"($2~/^[+0]/?"":234)$2+0}' file
143849998,+4564656
6345353,+345345
754656,+345345
64555546,+2343453452345
添加0到2美元会剥离任何前导零和/或加号,因为它对它进行算术运算,因此自然结果不会有符号或前导零。
请注意,此方法会将+03
转换为+3
和-3
转换为+-3
,以便在您的输入中出现这些内容并且不是所需的行为,更新您的问题以在示例输入/输出中显示这些案例。
答案 3 :(得分:1)
使用awk
:
awk 'BEGIN{FS=OFS=","} $2~/^0/{sub(/^0+/, "+", $2);} !($2~/^\+/){$2="+234" $2}1' file
143849998,+4564656
6345353,+345345
754656,+345345
64555546,+2343453452345
或使用非正则表达式检查:
awk 'BEGIN{FS=OFS=","} substr($2,1,1)=="0"{sub(/^0+/, "+", $2);}
substr($2,1,1)!="+"{$2="+234" $2}1' file
143849998,+4564656
6345353,+345345
754656,+345345
64555546,+2343453452345
答案 4 :(得分:0)
如果你的数据是这样的:
awk -F",|,[0]+" '/,\+/{ print $0;next } /,0/ {print $1",+"$2; next} {print $1",+234"$2} ' file
给出
143849998,+4564656
6345353,+345345
754656,+345345
64555546,+2343453452345
它的工作原理如下:
,
或,000
(任意数量为0)是字段分隔符。然后我们有三个规则:
,+
(字面意思) - >打印该行,转到下一行,0
- >拆分线(awk删除所有,0为我们),打印分开,转到下一行答案 5 :(得分:0)
您可以使用以下awk脚本:
awk -F, 'BEGIN{OFS=","}{sub(/^0+/, "+", $2)}!($2~/[0+]/){$2="+234"$2}1'
答案 6 :(得分:0)
这可能适合你(GNU sed):
sed '/,+/b;/,00*/s//,+/;t;s/,/&+234/' file
根据规范。