【问题标题】:Replacing white space differently depending on number of spaces in a shell根据 shell 中的空格数以不同方式替换空格
【发布时间】:2015-08-05 23:18:15
【问题描述】:

我有一个基于天气数据的奇怪格式的数据集,我怀疑这是 SED 的工作。 数据作为条目之间的空格或具有 2 个带标识符的空格。我正在尝试编写一个 shell 脚本来获取这些数据并将其转换为 CSV 文件。我使用 AWK 将空格替换为逗号,但后来我意识到空格的数量不同,因为有人决定做一些奇怪的事情。例如,我有一个子集:

USH00011084 1897   734  3  1292  3  1972  3  1786  3  2084  3  2761  3  2753  3  2547  3  2406  3  1878  3 -9999    -9999   
USH00011084 1900 -9999    -9999     1337a 3  1936  3  2378  3  2589  3  2770  3  2872  3  2700  3  2320  3  1486  3  1100  3
USH00011084 1926 -9999     1245     1251a    1781     2240     2654     2712     2763c    2770     2110     1256a    1421   
USH00011084 1927  1209     1821     1651     2183     2467     2707     2730     2594a    2579     2081     1907      871f 3
USH00011084 1928   800b    1135     1614     1711     2218     2596     2829     2817    -9999    -9999    -9999    -9999 

我认为如果少于 5 个空格,我可以使用 SED 放置一个逗号,如果有 5 个空格,我可以使用两个逗号;但是,我还没有完全弄清楚。任何建议将不胜感激。

【问题讨论】:

    标签: regex bash sed


    【解决方案1】:

    我会说...

    sed -e 's/     /,,/g' -e 's/ \+/,/g' file
    

    或者,更干净一点:

    sed -re 's/ {5}/,,/g' -e 's/ +/,/g' file
    

    两者都产生:

    USH00011084,1897,734,3,1292,3,1972,3,1786,3,2084,3,2761,3,2753,3,2547,3,2406,3,1878,3,-9999,-9999,
    USH00011084,1900,-9999,-9999,,1337a,3,1936,3,2378,3,2589,3,2770,3,2872,3,2700,3,2320,3,1486,3,1100,3
    USH00011084,1926,-9999,,1245,,1251a,1781,,2240,,2654,,2712,,2763c,2770,,2110,,1256a,1421,
    USH00011084,1927,1209,,1821,,1651,,2183,,2467,,2707,,2730,,2594a,2579,,2081,,1907,,,871f,3
    USH00011084,1928,800b,1135,,1614,,1711,,2218,,2596,,2829,,2817,-9999,-9999,-9999,-9999,
    

    逻辑就是你所说的:

    • 将 5 个空格替换为 ,,
    • , 替换一个或多个空格(第一次替换后仍然出现的空格)。

    【讨论】:

    • 你使用-e而不是;,或者只是偏好?
    • 另一种方法是使用ssed 's/ \{1,4\}/,/g'
    • @User112638726 我更喜欢-e,因为我看代码更好。我认为它们是完全等价的,但如果不是这样,请告诉我!另外,感谢您的建议,我将保持原样,直到我们从 OP 获得一些更新
    【解决方案2】:

    如果您不想依赖输入文件中的空格数,则可以使用此awk 命令:

    awk -v OFS=, '{$1=$1} 1' file
    USH00011084,1897,734,3,1292,3,1972,3,1786,3,2084,3,2761,3,2753,3,2547,3,2406,3,1878,3,-9999,-9999
    USH00011084,1900,-9999,-9999,1337a,3,1936,3,2378,3,2589,3,2770,3,2872,3,2700,3,2320,3,1486,3,1100,3
    USH00011084,1926,-9999,1245,1251a,1781,2240,2654,2712,2763c,2770,2110,1256a,1421
    USH00011084,1927,1209,1821,1651,2183,2467,2707,2730,2594a,2579,2081,1907,871f,3
    USH00011084,1928,800b,1135,1614,1711,2218,2596,2829,2817,-9999,-9999,-9999,-9999
    

    awk 命令的分解

    -F '[[:blank:]]+'   # use one of more whitespace a input field separator
    -v OFS=,            # use comma as output field separator
    {$1=$1}             # force awk to restructure each record
    

    【讨论】:

      猜你喜欢
      • 2017-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多