【问题标题】:How do I convert spaced columns to tabs? [duplicate]如何将间隔列转换为制表符? [复制]
【发布时间】:2017-07-08 18:20:14
【问题描述】:

这个问题不像有人建议的那样重复。模组,注意

我正在对包含以下信息的多个文件运行 for 循环

1    Leer            Normal   [status]     —      100
1    Wrap            Normal   [physical]   15     90
4    Poison Sting    Poison   [physical]   15     100
9    Bite            Dark     [physical]   60     100
12   Glare           Normal   [status]     —      100
17   Screech         Normal   [status]     —      85
20   Acid            Poison   [special]    40     100
25   Spit Up         Normal   [special]    —      100
25   Stockpile       Normal   [status]     —      —
25   Swallow         Normal   [status]     —      —
28   Acid Spray      Poison   [special]    40     100
33   Mud Bomb        Ground   [special]    65     85
36   Gastro Acid     Poison   [status]     —      100
38   Belch           Poison   [special]    120    90
41   Haze            Ice      [status]     —      —
44   Coil            Poison   [status]     —      —
49   Gunk Shot       Poison   [physical]   120    80

我需要能够从中提取数据。

问题是,每个文件都有不同的列长度。


第 2 列有时包含空格,因此不能选择压缩所有空格并使用空格作为分隔符进行剪切。我需要由制表符分隔的列而不使用特定信息,因为循环遍历了大约 800 个文件。

sed 's/  \+/ /g' | cut -f 2 -d " "

^ 不是我需要的,因为第 2 列中有空格

cut -b "5-20"

^ 也不能使用,因为每个文件的列长度不同。

【问题讨论】:

    标签: linux sed tabs format tabular


    【解决方案1】:

    使用 sed,用一个制表符替换多个连续的空格或制表符:

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

    说明:

    • s:替补
    • [[:space:]]:空格或制表符
    • \{1,\}: 至少发现一次时
    • g:将替换应用于行中的所有匹配项

    编辑:

    要保留第二列中的单个空格,您只能在找到 2 个空格/制表符时替换:

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

    【讨论】:

    • 谢谢!这非常有效。如果有人可以向我解释这段代码,那就太好了。
    • 看看它,它确实做了我不需要它做的事情。它还将第二列中的空格转换为制表符。我提供的示例脚本完全按照您所说的做,但更简单地显示了哪些不起作用。
    • 你是对的。我编辑并添加了一些解释。
    猜你喜欢
    • 2021-09-28
    • 2015-08-01
    • 1970-01-01
    • 2016-01-01
    • 2017-10-22
    • 2013-06-11
    • 2011-02-08
    • 2012-05-23
    相关资源
    最近更新 更多