我有一个包含以下内容的文本文件:
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 但这些都适用于长度相同的字符串。
答案 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