【问题标题】:Removing spaces from specific column in CSV file从 CSV 文件中的特定列中删除空格
【发布时间】:2015-03-12 09:16:59
【问题描述】:

我有一个 csv 文件,其中包含如下行:

300001;公司名称;023-1 2 3 4 5 6 7;023-3 2 4 6 43 4;email@test.com;;;;街道名称;184;;邮政编码;城市

我想去掉第 3 列和第 4 列(电话和传真号码)中的空格,使其看起来像这样:

300001;公司名称;023-1234567;023-3246434;email@test.com;;;;街道 姓名;184;;邮政编码;城市

我尝试了在 Stackoverflow 上找到的这些 awk 代码(第 3 列),但没有成功:

awk -v FS=OFS=";" '{gsub(/ /,"",$3)} 1' file.csv > test.csv
awk -F, '$3 ~ / / { OFS= ";"; $3 = ""; } 1' file.csv > test.csv

我已经在谷歌上搜索了半天,但找不到任何有用的东西。

【问题讨论】:

  • 你能扩展“没有运气”这句话吗?你的输出是什么?
  • 运气不好,我的意思是输出与输入相同。不过A.M.D.的回答好像解决了我的问题!
  • 嗯,问题在于-v FS=OFS=";" 表达式,gsub() 部分很好。你不能在同一个表达式中设置两个变量,所以你需要-v FS=";" -v OFS=";"

标签: bash csv awk


【解决方案1】:

试试这个:

awk 'BEGIN{FS=OFS=";"} {gsub(/ /,"",$3); gsub(/ /,"",$4)}1' File

我们将输入和输出字段分隔符设置为;。然后用nothing 替换3rd4th 字段中的空格。希望对您有所帮助。

正如其他人已经提到的那样,使用-v 一次性设置 FS 和 OFS (FS=OFS=";") 是它在您的情况下不起作用的原因。我将其移至BEGIN 块。就是这样。

【讨论】:

  • 哇,真快!您的答案似乎有效,我现在要在一些文件上进行测试。谢谢!
  • 我会等你的结果 :-)
  • Aaaaand..... 结果出来了!它就像一个魅力。尽管此线程中提到的其他解决方案也有效,但我会将您的解决方案标记为您是第一个 ;-) 谢谢!
【解决方案2】:

问题是您不能一次性设置FSOFS。将两者分开

$ awk  -vFS=";" -vOFS=";" '{gsub(" ","",$3); gsub(" ", "", $4) }1' input
300001;Company Name;023-1234567;023-3246434;email@test.com;;;;Street Name;184;;Postal Code;City

【讨论】:

    【解决方案3】:

    您的问题原因是-v FS=OFS=";",您可以使用:

    awk -F';' -v OFS=";" '...'
    

    awk 'BEGIN{FS=OFS=";"} ...'
    

    其他代码看起来没问题,只是您忘记了第 4 列。这行应该可以工作:

    awk -F';' -v OFS=";" 'gsub(/ /,"",$3)+gsub(/ /,"",$4)+7' file
    

    【讨论】:

    • 'gsub(/ /,"",$3)+gsub(/ /,"",$4)+7''{gsub(/ /,"",$3);gsub(/ /,"",$4)}7' 短一个字符。不确定是否值得在清晰度上进行权衡,或者我花了时间思考它来说服自己它总是会成功!
    猜你喜欢
    • 2012-06-29
    • 2018-05-08
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    相关资源
    最近更新 更多