我在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
答案 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)
我看到两种可能性。
gsub
中使用更一般的正则表达式来解决这个问题:而不是/ /
,请使用/[[:space:]]/
。 如果能解决您的问题,那太好了!你很幸运,继续前进。 :)
另一个可能的问题是棘手的。 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并不是真的为此而构建的变得很难看。)