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使用更通用的方法查看更新。