【问题标题】:insert a character between instance of two characters在两个字符的实例之间插入一个字符
【发布时间】:2015-02-20 00:50:51
【问题描述】:

我有一个包含 X 行的 csv 文件,格式如下

P26439,341,P,L,,P26439,,-0.41

每次出现双逗号的地方,即,, 我想在它们之间插入单词 NA,这样它就会显示为,NA,

有人有 sed、tr、perl 或 awk 解决方案吗?

我知道我可以通过以下方式使用 tr 替换字符:

tr ",," ",NA,"

但是,这会替换任何逗号实例。

【问题讨论】:

  • tr 只替换单个字符。例如,tr abc ABC 将任何 a、b 或 c 更改为大写
  • 行首或行尾也不能有空域吗?

标签: regex perl awk sed tr


【解决方案1】:

如果您有可能连续丢失字段,您需要这样做:

$ cat file
P26439,341,P,L,,P26439,,-0.41
P26439,341,P,L,,,P26439,,-0.41
P26439,341,P,L,,,,P26439,,-0.41

$ sed ':a;s/,,/,NA,/;ta' file
P26439,341,P,L,NA,P26439,NA,-0.41
P26439,341,P,L,NA,NA,P26439,NA,-0.41
P26439,341,P,L,NA,NA,NA,P26439,NA,-0.41

【讨论】:

  • 这是一个很好的观点。刚刚在这里使用第一个答案时注意到了这个问题
  • :ata iiSeymour 是什么意思?
  • @sputnick 这是conditional branching
  • 假设 NA 不是第一个和最后一个字段(正如请求中提到的那样)
【解决方案2】:

尝试使用 执行此操作:

sed 's/,,/,NA,/g' file.csv

一次只能用于一个字符。

如果您想就地编辑文件,请添加-i 开关:

sed -i.bak 's/,,/,NA,/g' file.csv

【讨论】:

    【解决方案3】:

    Perl 解决方案:

    $ echo "P26439,341,P,L,,P26439,,-0.41" | perl -pe 's/,,/,NA,/g'
    P26439,341,P,L,NA,P26439,NA,-0.41
    

    【讨论】:

    • 您可能想在此处添加更多解释 - 此答案已被系统标记为“低质量”
    【解决方案4】:
    sed ':cycle
    s/,,/,NA/g;t cycle
    s/^,/NA,/;s/,$/,NA/' YourFile
    
    • 为任何字段设置 NA,包括第一个和最后一个。
    • 后续多次出现,,, 需要该循环,其中在第一个循环中仅处理第一个 ,,,而第二个(以及任何其他多次出现的 2 次)不变

    【讨论】:

      【解决方案5】:

      通过awk

      awk -F',' '{for (i=1;i<=NF;i++) if ($i=="") $i="NA" }1' OFS=','  file
      
      • NA 字符串替换第一个、中间、最后一个或多次出现的每个空字段。

      输入:

      ,P26439,341,P,L,,P26439,,-0.41
      P26439,341,P,L,,P26439,,-0.41
      P26439,341,P,L,,P26439,,-0.41,
      P26439,341,P,L,,,,P26439,,-0.41
      

      输出:

      NA,P26439,341,P,L,NA,P26439,NA,-0.41
      P26439,341,P,L,NA,P26439,NA,-0.41
      P26439,341,P,L,NA,P26439,NA,-0.41,NA
      P26439,341,P,L,NA,NA,NA,P26439,NA,-0.41
      

      【讨论】:

        猜你喜欢
        • 2020-03-04
        • 1970-01-01
        • 2018-08-25
        • 1970-01-01
        • 2020-06-23
        • 1970-01-01
        • 2015-04-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多