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