Linux 如何将间隔列转换为制表符?
这个问题并不像有人所说的那样是重复的。Mods,注意 我在多个包含如下信息的文件上运行for循环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]
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列中的空格转换为制表符。我提供的示例脚本完全按照您所说的做,但更简单的是显示什么不起作用。您是对的。我编辑并添加了一些解释。