在文本文件中拆分字符串

时间:2017-02-18 06:00:04

标签: r bash awk split

我有一个包含以下内容的文本文件:

19810101 20
19810102 31
19810103 1
19810701 1
19811105 5

我想要这样的东西并保存为csv文件。

1981 01 01 20
1981 01 02 31
1981 01 03 1
1981 07 01 1
1981 11 05 5

在R,bash还是awk中有一种简单的方法吗?

我在看类似的帖子: [1] Split a string every 5 characters [2] Split into 3 character length 但这些都适用于长度相同的字符串。

4 个答案:

答案 0 :(得分:2)

我们可以使用extract

中的tidyverse
library(tidyverse)
extract(df1, v1, into = c("Year", "Month", "Day"), "(.{4})(.{2})(.{2})")

数据

df1 <- structure(list(v1 = c(19810101L, 19810102L, 19810103L, 19810701L, 
 19811105L), v2 = c(20L, 31L, 1L, 1L, 5L)), .Names = c("v1", "v2"
), class = "data.frame", row.names = c(NA, -5L))

答案 1 :(得分:1)

<强>输入

$ cat f
19810101 20
19810102 31
19810103 1
19810701 1
19811105 5

<强>输出

$ awk '{print substr($1,1,4),substr($1,5,2),substr($1,7),$2}' f
1981 01 01 20
1981 01 02 31
1981 01 03 1
1981 07 01 1
1981 11 05 5

适用于CSV

$ awk  '{print substr($1,1,4),substr($1,5,2),substr($1,7),$2}' OFS=, f
1981,01,01,20
1981,01,02,31
1981,01,03,1
1981,07,01,1
1981,11,05,5

答案 2 :(得分:1)

下面的

将起作用

sed -r 's/([[:digit:]]{4})([[:digit:]]{2})([[:digit:]]{2})/\1 \2 \3/' lines.txt|tr ' ' , > newfile.csv

sed -r 's/(.{4})(.{2})(.{2})/\1 \2 \3/' lines.txt |tr ' ' ,  > newfile.csv

答案 3 :(得分:1)

awk '{sub(/..../,"& ")sub(/../,"& ",$2)}1' file

1981 01 01 20
1981 01 02 31
1981 01 03 1
1981 07 01 1
1981 11 05 5