Linux 如何将一行划分为多行?
数据格式如下(用制表符分隔): 输出:Linux 如何将一行划分为多行?,linux,r,shell,awk,sed,Linux,R,Shell,Awk,Sed,数据格式如下(用制表符分隔): 输出: A 1 2 3 A 5 6 9 B 2 3 4 B 6 7 8 它们由制表符分隔。有什么好办法吗 awk -F"\t" -v OFS="\t" '{print $1, $2, $3, $4"\n" $1, $5, $6, $7}' file awk允许您按数字引用数据中的字段,注意$1会被使用两次,并从行中返回first值。2-7美元也一样。字段由FS(字段分隔符变量)确定,在这种情况下,-F是输入FS,而OFS是输出FS。两者都设置为tab
A 1 2 3
A 5 6 9
B 2 3 4
B 6 7 8
它们由制表符分隔。有什么好办法吗
awk -F"\t" -v OFS="\t" '{print $1, $2, $3, $4"\n" $1, $5, $6, $7}' file
awk允许您按数字引用数据中的字段,注意$1会被使用两次,并从行中返回first值。2-7美元也一样。字段由FS
(字段分隔符变量)确定,在这种情况下,-F
是输入FS,而OFS是输出FS。两者都设置为tab char(\t
)
输出
A 1 2 3
A 5 6 9
B 2 3 4
B 6 7 8
C 5 5 7
C 5 6 9
IHTH在
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
m1使用sed
,只需将制表符转换为空格:
sed -re "s/\t/ /g" input.txt
要仅将数字之间的制表符转换为空格,请执行以下操作:
sed -re "s/([0-9])(\t)([0-9])/\1 \3/g" input.txt
以下是在给定列号处添加换行符的通用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
awk-vn=3'开始{FS=OFS=“\t”}{
对于(i=2;i2 | | NR>1)ORS$1:“$1;
打印F OFS$i
}
}
结束{print”“}文件
A 12 3
A 569
B 2 3 4
B 6 7 8
C 5 5 7
C 5 6 9
这可能适合您(GNU-sed):
3
字段可以更改为需要中断的任何字段。需要澄清。输入中是否总是有这样的7列,并且您希望在第4列有新行?仅举一个例子,我有180列和220行。如果一行有180个数字,由制表符分隔,则每6个数字拆分一行?对不起,这将是一个非常不同的答案,我要睡觉了。在任何情况下,您都应该发布一个单独的问题,并指出7个字段只是一个示例,您确实需要一个更通用的解决方案。不过,请将uno添加到示例数据和所需输出中。祝你好运
sed -re "s/([0-9])(\t)([0-9])/\1 \3/g" input.txt
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
sed -r 's/^((\S+)(\s+\S+){3})/&\n\2/' file