【问题标题】:Replace multiple consecutive white spaces with one comma in Unix在 Unix 中用一个逗号替换多个连续的空格
【发布时间】:2014-05-31 03:49:35
【问题描述】:

我有以下 sed 命令:

sed 's/\s/,/g' input > output.csv

(我从this相关主题得到命令)

这会变成以下输入:

SNP  A1  A2     FRQ    INFO      OR      SE       P
10:33367054   C   T  0.9275  0.9434  1.1685  0.1281  0.1843
10:33367707   G   A  0.9476  0.9436  1.0292  0.1530  0.8244
10:33367804   G   C  0.4193  1.0443  0.9734  0.0988  0.6443
10:33368119   C   A  0.9742  0.9343  1.0201  0.1822  0.9156

进入:

SNP,,A1,,A2,,,,,FRQ,,,,INFO,,,,,,OR,,,,,,SE,,,,,,,P
10:33367054,,,C,,,T,,0.9275,,0.9434,,1.1685,,0.1281,,0.1843
10:33367707,,,G,,,A,,0.9476,,0.9436,,1.0292,,0.1530,,0.8244
10:33367804,,,G,,,C,,0.4193,,1.0443,,0.9734,,0.0988,,0.6443
10:33368119,,,C,,,A,,0.9742,,0.9343,,1.0201,,0.1822,,0.9156

我需要一个命令,将多个连续的空格变成一个逗号,给我这样的输出:

SNP,A1,A2,FRQ,INFO,OR,SE,P
10:33367054,C,T,0.9275,0.9434,1.1685,0.1281,0.1843
10:33367707,G,A,0.9476,0.9436,1.0292,0.1530,0.8244
10:33367804,G,C,0.4193,1.0443,0.9734,0.0988,0.6443
10:33368119,C,A,0.9742,0.9343,1.0201,0.1822,0.9156

有什么想法吗?

【问题讨论】:

标签: unix csv sed whitespace


【解决方案1】:

如果你想使用sed,你可以使用这个:

$ sed 's/ \{1,\}/,/g' file
SNP,A1,A2,FRQ,INFO,OR,SE,P
10:33367054,C,T,0.9275,0.9434,1.1685,0.1281,0.1843
10:33367707,G,A,0.9476,0.9436,1.0292,0.1530,0.8244
10:33367804,G,C,0.4193,1.0443,0.9734,0.0988,0.6443
10:33368119,C,A,0.9742,0.9343,1.0201,0.1822,0.9156

它基于格伦杰克曼对How to strip multipe spaces to one using sed? 的回答。

也可以这样

sed 's/[[:space:]]\{1,\}/,/g' file

请注意,您可以使用sed -i.bak '...' file 进行就地编辑,以便将原始文件备份为file.bak,而file 将具有编辑后的内容。


但我认为tr 更清楚。有了它,您可以压缩空格,然后用逗号替换每个空格:

$ tr -s ' ' < file | tr ' ' ','
SNP,A1,A2,FRQ,INFO,OR,SE,P
10:33367054,C,T,0.9275,0.9434,1.1685,0.1281,0.1843
10:33367707,G,A,0.9476,0.9436,1.0292,0.1530,0.8244
10:33367804,G,C,0.4193,1.0443,0.9734,0.0988,0.6443
10:33368119,C,A,0.9742,0.9343,1.0201,0.1822,0.9156

按件:

$ tr -s ' ' < file
SNP A1 A2 FRQ INFO OR SE P
10:33367054 C T 0.9275 0.9434 1.1685 0.1281 0.1843
10:33367707 G A 0.9476 0.9436 1.0292 0.1530 0.8244
10:33367804 G C 0.4193 1.0443 0.9734 0.0988 0.6443
10:33368119 C A 0.9742 0.9343 1.0201 0.1822 0.9156

来自man tr:

tr [选项]... SET1 [SET2]

翻译、压缩和/或删除标准输入中的字符, 写入标准输出。

-s, --squeeze-repeats

替换列表中列出的重复字符的每个输入序列 SET1 只出现一次该字符

【讨论】:

    【解决方案2】:

    如果您使用-r 启用扩展正则表达式,那么您只需将+ 添加到\s,这意味着一个或多个:

    $ sed -r 's/\s+/,/g' file.txt
    SNP,A1,A2,FRQ,INFO,OR,SE,P
    10:33367054,C,T,0.9275,0.9434,1.1685,0.1281,0.1843
    10:33367707,G,A,0.9476,0.9436,1.0292,0.1530,0.8244
    10:33367804,G,C,0.4193,1.0443,0.9734,0.0988,0.6443
    10:33368119,C,A,0.9742,0.9343,1.0201,0.1822,0.9156
    

    供参考:

    -r, --regexp-extended
        use extended regular expressions in the script.
    

    注意:在 Mac OS X 上,sed 基于 BSD,没有 GNU 扩展,因此您必须使用 -E 标志:

    -E    Interpret regular expressions as extended (modern) regular expressions rather
          than basic regular expressions (BRE's). The re_format(7) manual page fully 
          describes both formats.
    

    【讨论】:

      【解决方案3】:

      这是一个非常简单的解决方案,awk

      awk '{$1=$1}1' OFS=, file
      SNP,A1,A2,FRQ,INFO,OR,SE,P
      10:33367054,C,T,0.9275,0.9434,1.1685,0.1281,0.1843
      10:33367707,G,A,0.9476,0.9436,1.0292,0.1530,0.8244
      10:33367804,G,C,0.4193,1.0443,0.9734,0.0988,0.6443
      10:33368119,C,A,0.9742,0.9343,1.0201,0.1822,0.9156
      

      $1=$1 重新格式化文件,以便所有多余的空格都设置为一个空格。

      【讨论】:

      • @BMW 我知道,但{$1=$1}1 比$1=$1 更安全。如果有空行或以0 开头的行,$1=$1 将失败。
      猜你喜欢
      • 1970-01-01
      • 2015-11-15
      • 2011-04-21
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 2010-12-31
      • 2015-03-27
      • 1970-01-01
      相关资源
      最近更新 更多