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

时间:2017-07-08 18:20:14

标签: linux sed tabs format tabular

  

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

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

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

2 个答案:

答案 0 :(得分:1)

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

s

<强>说明:

  • [[:space:]]:替换
  • \{1,\}:空格或制表符
  • g:至少发现一次事件
  • sed 's/[[:space:]]\{2,\}/\t/g' file :将替换应用于行
  • 中的所有匹配项

修改

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

vector<Mat> regionMapHist(RegionRowNum * RegionColNum);

答案 1 :(得分:-1)

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

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