Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何将间隔列转换为制表符?_Linux_Sed_Tabs_Format_Tabular - Fatal编程技术网

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

Linux 如何将间隔列转换为制表符?,linux,sed,tabs,format,tabular,Linux,Sed,Tabs,Format,Tabular,这个问题并不像有人所说的那样是重复的。Mods,注意 我在多个包含如下信息的文件上运行for循环 1 Leer Normal [status] — 100 1 Wrap Normal [physical] 15 90 4 Poison Sting Poison [physical] 15 100 9 Bite Dark [physical]

这个问题并不像有人所说的那样是重复的。Mods,注意

我在多个包含如下信息的文件上运行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列有时包含空格,因此压缩所有空格并将空格用作cut的分隔符不是一个选项。我需要用标签分隔列,而不使用特定信息,因为循环涉及大约800个文件

sed 's/  \+/ /g' | cut -f 2 -d " "
^不是我需要的,因为第2列中有空格

cut -b "5-20"

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

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

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

s:替补 [[:空格:][]:空格或制表符 \{1,\}:至少找到一个匹配项时 g:对行中的所有引用应用替换 编辑:

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

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

这正是我需要它做的。它将分隔的列转换为制表符,而不会弄乱第二列中的空格。我运行它是为了检查它是否对所有文件进行了正确排序,到目前为止,已经有40个文件通过了

sed s/\s\s\+/:/g' | sed 's/\([a-z)]\)\s\([(0-9A]\)/\1:\2/g'

谢谢这很有效。如果有人能给我解释一下这段代码,那就太好了。看着它,它做的正是我不需要它做的。它还将第2列中的空格转换为制表符。我提供的示例脚本完全按照您所说的做,但更简单的是显示什么不起作用。您是对的。我编辑并添加了一些解释。