数据格式如下(由制表符分隔):
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
它们由制表符分隔。有没有好办法呢?
答案 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