如何在shell脚本的每个记录中的每个第二个分隔字段中添加前缀?

时间:2014-08-15 08:41:27

标签: bash shell awk

我有一个包含逗号分隔的以下记录的文件:

143849998,+4564656
6345353,000345345
754656,0345345
64555546,3453452345

要求是为每条记录中的每个第2个字段添加一定的前缀。前缀在不同条件下是不同的。逻辑是:

  1. 如果第二个字段以“+”开头,则保持原样。
  2. 如果第二个字段以“0”开头(任意数量的零,无关紧要),请用“+”替换所有零。
  3. 如果有任何其他条件前缀“+234”。
  4. 输出应该是这样的:

    143849998,+4564656
    6345353,+345345
    754656,+345345
    64555546,+2343453452345
    

    如何使用AWK实现这一目标?我能够执行最后一个条件,第一个条件是直接的,但是当我试图在一个awk命令中使用所有条件时,我失败了。

7 个答案:

答案 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)是字段分隔符。然后我们有三个规则:

  1. 匹配,+(字面意思) - >打印该行,转到下一行
  2. 匹配,0 - >拆分线(awk删除所有,0为我们),打印分开,转到下一行
  3. 如果到目前为止没有匹配,请在第二个前加上" + 234"

答案 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

根据规范。