簡體   English   中英

使用awk從CSV列中刪除空格時出現輕微錯誤

[英]Slight error when using awk to remove spaces from a CSV column

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

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

在400行中,即使我在final.csv上重新運行腳本,我也有大約5行不起作用。 誰能協助我解決這個問題? 先感謝您。

編輯:這是分別對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

您可以使用字符串函數 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. 最簡單的是,您除了空格以外還有一些空白。 您可以通過在gsub使用更通用的正則表達式來解決此問題:代替/ / ,請使用/[[:space:]]/

如果這樣可以解決您的問題,那就太好了! 您很幸運,繼續前進。 :)

  1. 另一個可能的問題是棘手的。 CSV(或在這種情況下為pipe-SV)格式並不像它看起來的那么簡單,因為您可以在字段中加引號分隔符。 例如,這是用豎線分隔的文件中完全有效的4字段行:

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

    如果文件中一行的前4個字段看起來像這樣,則$26gsub實際上$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並不是真正為此而構建的,並且它的運行速度很快。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM