如何将一行划分为多行?

时间:2015-06-14 04:34:42

标签: linux r shell awk sed

数据格式如下(由制表符分隔):

A  1    2    3    5    6    9  
B  2    3    4    6    7    8 
C  5    5    7    5    6    9

输出:

A  1 2 3
A  5 6 9
B  2 3 4
B  6 7 8

它们由制表符分隔。有没有好办法呢?

5 个答案:

答案 0 :(得分:2)

Group Join

awk允许您按数字引用数据中的字段,请注意$ 1会被使用两次,并从该行返回第一个值。 $ 2- $ 7相同。字段由awk -F"\t" -v OFS="\t" '{print $1, $2, $3, $4"\n" $1, $5, $6, $7}' file (字段分隔符变量)确定,在这种情况下,FS是输入FS,而OFS是输出FS。两者都设置为tab char(-F)。

<强>输出

\t

IHTH

答案 1 :(得分:2)

以下是在给定列号处添加换行符的通用awk解决方案:

awk -v n=3 'BEGIN{FS=OFS="\t"} {
    for (i=2; i<=NF; i++) {
       if ((i-2)%n == 0)
          printf (i>2||NR>1)?ORS $1:"" $1;
       printf OFS $i
    }
}
END {print ""}' file
A   1   2   3
A   5   6   9
B   2   3   4
B   6   7   8
C   5   5   7
C   5   6   9

答案 2 :(得分:1)

R中,使用read.table/read.csv

阅读数据后
 data.frame(Col1=rep(df1[,1],each=2),
           matrix(t(df1[-1]), ncol=3, byrow=TRUE))
 #   Col1 X1 X2 X3
 #1    A  1  2  3
 #2    A  5  6  9
 #3    B  2  3  4
 #4    B  6  7  8
 #5    C  5  5  7
 #6    C  5  6  9

如果您有180列和220行,

m1 <- matrix(t(df2), ncol=6, byrow=TRUE)
m1[1:6,]
#     [,1] [,2] [,3] [,4] [,5] [,6]
#[1,]    3   10    6    3    8    1
#[2,]    6    3    6    8    5    7
#[3,]   10    4    8    1    9    5
#[4,]   10    3    2    3    6    4
#[5,]    3    5    3    8    2    8
#[6,]    4    5    8    1    8    4

df2[1:2, 1:18]
#   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18
#1  3 10  6  3  8  1  6  3  6   8   5   7  10   4   8   1   9   5
#2  3  6  7 10  3  9  3  5  1   6   1   8  10   6   1   9   3   8

数据

df1 <- structure(list(V1 = c("A", "B", "C"), V2 = c(1L, 2L, 5L), 
V3 = c(2L, 
 3L, 5L), V4 = c(3L, 4L, 7L), V5 = c(5L, 6L, 5L), V6 = c(6L, 7L, 
6L), V7 = c(9L, 8L, 9L)), .Names = c("V1", "V2", "V3", "V4", 
"V5", "V6", "V7"), class = "data.frame", row.names = c(NA, -3L))

set.seed(24)
df2 <- as.data.frame(matrix(sample(1:10, 180*220, 
           replace=TRUE), nrow=220))

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed -r 's/^((\S+)(\s+\S+){3})/&\n\2/' file

3字段可以更改为您需要中断的任何字段。

答案 4 :(得分:-1)

使用sed,只需将标签转换为空格:

sed -re "s/\t/ /g" input.txt 

仅将数字之间的标签转换为空格:

sed -re "s/([0-9])(\t)([0-9])/\1 \3/g" input.txt