使用awk从CSV列中删除空格时出现轻微错误

时间:2015-07-21 08:32:26

标签: bash csv awk

我在bash脚本上使用了以下awk命令删除了我的CSV第26列的空格;

awk 'BEGIN{FS=OFS="|"} {gsub(/ /,"",$26)}1' original.csv > final.csv

在400行中,我有大约5个随机行,即使我在final.csv上重新运行脚本,这也不起作用。任何人都可以帮助我解决这个问题吗?提前谢谢。

编辑:以下是original.csv与final.csv的第26列示例;

2212026837                         2212026837
2256  41688  6                     2256416886
2076113566                         2076113566
2009  84517  7                     2009845177
2067950476                         2067950476
2057  90531  5                     2057  90531  5  
2085271676                         2085271676
2095183426                         2095183426
2347366235                         2347366235
2200160434                         2200160434
2229359595                         2229359595
2045373466                         2045373466
2053849895                         2053849895
2300  81552  3                     2300  81552  3

2 个答案:

答案 0 :(得分:1)

您可以使用string function split,并迭代相应的数组以重新分配第26个字段:

awk 'BEGIN{FS=OFS="|"} {
    n = split($26, a, /[[:space:]]+/)
    $26=a[1]
    for(i=2; i<=n; i++)
        $26=$26""a[i]
}1' original.csv > final.csv

答案 1 :(得分:1)

我看到两种可能性。

  1. 最简单的是你有一个空格以外的空格。您可以在gsub中使用更一般的正则表达式来解决这个问题:而不是/ /,请使用/[[:space:]]/
  2. 如果能解决您的问题,那太好了!你很幸运,继续前进。 :)

    1. 另一个可能的问题是棘手的。 CSV(或者,在本例中为pipe-SV)格式并不像看起来那么简单,因为您可以在字段内部引用分隔符。例如,这是管道分隔文件中完全有效的4字段行:

      field 1|"field 2 contains some |pipe| characters"|field 3|field 4
      

      如果您文件中某一行的前4个字段看起来像这样,那么gsub上的$26实际上会在$24上运行,而只留下$26。如果您有这样的数据,唯一真正的解决方案是使用脚本语言和实际的CSV解析库。 Perl有Text::CSV,但默认情况下没有安装; Python的csv模块是,所以你可以使用这样的程序:

      import csv, fileinput as fi, re;    
      for row in csv.reader(fi.input(), delimiter='|'):
        row[25] = re.sub(r'\s+', '', row[25]) # fields start at 0 instead of 1
        print '|'.join(row)
      

      将上述内容保存在colfixer.py等文件中,并使用python colfixer.py original.csv >final.csv运行。

      (如果你努力了,你可以把它推到一个-c选项字符串并从命令行运行而不创建一个脚本文件,但Python并不是真的为此而构建的变得很难看。)