Unix 按标题将基于行的数据转换为列

Unix 按标题将基于行的数据转换为列,unix,text,file-handling,Unix,Text,File Handling,我有一个(相当大)的文件,格式如下: SET1 A B C D E F G SET2 H I J K L M SETX (...) 等等 我更喜欢吃 SET1 SET2 SETX A H (...) B I C J D K E L F M G 请注意,这些列的长度不等,并且它们不是按大小排序的。我的文件太大,无法使用unix中内置的列函数,试图通过拼接文件然后将其粘贴在一起来获得可爱的效果有问题(也

我有一个(相当大)的文件,格式如下:

SET1
A B C D E F G

SET2
H I J K L M

SETX
(...)
等等

我更喜欢吃

SET1    SET2   SETX
A       H     (...)
B       I
C       J
D       K
E       L
F       M
G
请注意,这些列的长度不等,并且它们不是按大小排序的。我的文件太大,无法使用unix中内置的
函数,试图通过拼接文件然后将其粘贴在一起来获得可爱的效果有问题(也就是说,它导致空列获得与分隔符相同的内容,这对我来说不起作用-它们最终都是“\t”)。请注意,每个集合可能包含数百个条目,而我有数千个集合,这使得awk不切实际(至少在我公认的技能有限的情况下)

理想情况下,输出应该是可读的R,但在这一点上,我会非常高兴的东西,实际上可以翻译成R输入。注意,如果这更实用的话,我完全可以接受使用非空白分隔符

非常感谢您的帮助!在外部linux环境中工作

编辑: 我也有可用的文件

SET1
A
B
C
D
E
F
G

SET2
H
I
J
K
L
M

如果这能让事情变得更简单的话。

我想这正是你想要的:

awk -v OFS="\t" 
    '/^SET/ {sets[++cols]=$0; set=$0; max_recs=(c>max_recs?c:max_recs); c=0; next}
     NF{a[cols,++c]=$0}

     END {
        for (i=1;i<=cols; i++) printf "%s%s", sets[i], OFS
        print ""
        for (i=1; i<=max_recs; i++) { 
            for (j=1; j<=cols; j++) printf "%s%s", a[j,i], OFS
            print ""
        }
     }' file
它返回:

$ awk -v OFS="\t" '/^SET/ {sets[++cols]=$0; set=$0; max_recs=(c>max_recs?c:max_recs); c=0; next} NF{a[cols,++c]=$0} END {for (i=1;i<=cols; i++) printf "%s%s", sets[i], OFS; print ""; for (i=1; i<=max_recs; i++) { for (j=1; j<=cols; j++) printf "%s%s", a[j,i], OFS; print ""}}' file
SET1    SET2    SET3    
B   H   A   
C   I   B   
D   J   C   
E   K   D   
F   L       
G   M       
    AAA     
SET1    SET2
A       H
B       I
C       J
D       K
E       L
F       M
G   
对于给定的输入,它将返回:

$ awk -v OFS="\t" '/^SET/ {sets[++cols]=$0; set=$0; max_recs=(c>max_recs?c:max_recs); c=0; next} NF{a[cols,++c]=$0} END {for (i=1;i<=cols; i++) printf "%s%s", sets[i], OFS; print ""; for (i=1; i<=max_recs; i++) { for (j=1; j<=cols; j++) printf "%s%s", a[j,i], OFS; print ""}}' file
SET1    SET2    SET3    
B   H   A   
C   I   B   
D   J   C   
E   K   D   
F   L       
G   M       
    AAA     
SET1    SET2
A       H
B       I
C       J
D       K
E       L
F       M
G   

您的数据是否会出现
SET2
将是
hi。。。L''M
?i、 e.是否会有空格,或者如您所示,一组可能比另一组“长”,没有空格。?祝你好运。没有填充-字母代表密码,任何重叠都是完全巧合。只是用空格分隔的简单列表。老实说,这有点尴尬,我认为我至少在这方面做得足够体面,可以做简单的格式化…不用担心,只是不想尝试解决错误的问题;-)实际上,添加一个小的文件示例列表,然后为相同的输入显示转换后的输出文件列表可能会有所帮助。最后,当我刚刚进入“R”时,我希望它有一些功能可以为您处理这个问题。添加和“R”标记,查看您获得的内容或搜索
[R]transform
(共有4000多个项目)。祝你好运。另外,你已经指定了
unix
linux
平台上的许多相同工具具有较少的限制。通常,您可以将
gnucore
utils安装到
unix
或将文件复制到linux机器上,看看
columns
现在是否解决了您的问题。另外,请说明最终结果是否是一个包含所有1000+集的大文件?文件名有多大。如果文件名列表的大小超过了shell命令行缓冲区的大小,这将是一个更难解决的问题。祝你好运。专栏不起作用,我试过了。这是一个大文件,当我试图处理它时,列(和某些其他工具)会耗尽内存——这是我沮丧的一部分,我的文件太大,无法使用我通常在这些情况下使用的文件。我已经由jerry自己操纵了一个解决方案,在第二个数据集上使用awk,然后使用shellscript将它们粘贴在一起。我真的更喜欢更优雅的解决方案!解决方案的基本意义是可行的(使用带有固定分隔符的粘贴),但我的文件中有几千个集,而您的解决方案实际上没有考虑到这一点。我很感激你的努力,它确实帮助了我,但我认为我不能接受,因为你没有真正解决我的一般问题。没有问题。你有很多套?我知道每套都有很多东西。我看错了,是我的错。然后这可以在
awk
中实现,我将查看是否可以发布更新。@user3034187使用更通用的方法查看更新。