【问题标题】:Replacing the pipe in the double quoted csv file with comma using awk command使用 awk 命令用逗号替换双引号 csv 文件中的管道
【发布时间】:2017-11-17 15:09:58
【问题描述】:

我有包含管道的数据,我想用逗号替换这些管道。以下是数据样本

"PT3QB789TSUIDF371261","THE TORONTO|DOMINION BANK","2016-05-24T00:36:42Z","ANZ BANK NEW| ZEALAND LIMITED","HZSN7FQBPO5IEWYIGC72","MAS|CA.ON.OSC|ASIC*|AAAA"
"PT3QB789TSUIDF371261","ABC|XYZ|123","2016-05-24T00:36:42Z","ANZ BANK NEW ZEALAND LIMITED","HZSN7FQBPO5IEWYIGC72","MAS|CA.ON.OSC|ASIC*"

我的输出应该是这样的

"PT3QB789TSUIDF371261","THE TORONTO,DOMINION BANK","2016-05-24T00:36:42Z","ANZ BANK NEW, ZEALAND LIMITED","HZSN7FQBPO5IEWYIGC72","MAS,CA.ON.OSC,ASIC*,AAAA"
"PT3QB789TSUIDF371261","ABC,XYZ,123","2016-05-24T00:36:42Z","ANZ BANK NEW ZEALAND LIMITED","HZSN7FQBPO5IEWYIGC72","MAS,CA.ON.OSC,ASIC*"

我尝试了以下对我不起作用的命令

awk -F"\"" 'BEGIN{OFS="\""}{for(i=1;i<=NF;++i){ if(i%2==0) gsub(/|/, ",", $i)}} {print $0}' file

【问题讨论】:

  • 一个简单的sed 's/|/,/g' file 将适用于给定的样本.. 您使用awk 的任何其他原因?
  • 你的命令的一个问题是/|/ ...|是一个元字符,所以它应该是/\|/
  • 为什么?这只会让你的文件在之后使用命令行工具更难做任何其他事情,因为他们需要额外的逻辑来区分字段内的逗号和字段之间的逗号。

标签: linux bash csv awk


【解决方案1】:

如果你可以选择不使用 awk 那么你可以试试这个 -

sed -i 's/theOriginalChar/theNewChar/g' theFile.txt

如果你必须使用 awk- 请注意,竖线 (|) 允许使用正则表达式 如此使用|在您的示例中,您需要在 |

之前添加 \

【讨论】:

    【解决方案2】:

    如果要将所有管道更改为逗号,请使用 sed:

    sed -i 's/|/,/g' file.txt
    

    或tr:

    tr \| , < file.txt > file1.txt
    

    但是...如果您真的想使用 awk,我会尝试这样的事情(现在无法测试):

    awk -F\| 'BEGIN{OFS=","} {$1=$1; print}' file.txt > file1.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-06
      • 2016-07-03
      • 2016-03-18
      • 2017-04-09
      • 1970-01-01
      • 2020-10-14
      • 1970-01-01
      • 2017-09-28
      相关资源
      最近更新 更多