linux - 如何将间隔列转换为制表符?

标签 linux sed tabs format tabular

This question is not a duplicate as someone had suggested. Mods, pay attention

我正在对包含如下信息的多个文件运行 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"

^ 也无法使用此选项,因为每个文件的列长度不同。

最佳答案

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

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

说明:

  • s:替换
  • [[:space:]]:空格或制表符
  • \{1,\}:当至少找到一个匹配项时
  • g:将替换应用于行中的所有出现位置

编辑:

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

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

关于linux - 如何将间隔列转换为制表符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44989416/

相关文章:

javascript - 使用 javascript 将 HTML 子选项卡和父选项卡添加到事件类

qt - 在qt中的样式表中自定义选项卡控件

JavaScript/REST - 创建选项卡 div 元素后构建选项卡

linux - 如何以编程方式运行多个 screen ,每个 screen 都使用一个命令?

linux - 如果输入的第一行包含字符串,我如何使用 sed 或 grep 删除它?

c - 基于函数的 CPE,如何计算下限?

regex - OSX : change date format in multiple file names

nginx - 如何在docker run中使用sed命令替换nginx docker镜像的.conf文件中的文本?

linux - 如果绑定(bind)到特定接口(interface)然后 IP 发生变化,会发生什么情况?

linux - .zshrc 中最有效的 if 语句来检查 Linux 操作系统是否在 WSL 上运行?