Python 使用grep或awk将一列拆分为多个列,标题位于原始文件标题中
我有以下输出Python 使用grep或awk将一列拆分为多个列,标题位于原始文件标题中,python,bash,awk,Python,Bash,Awk,我有以下输出 SRR51XXXX 5 6 7 SRR51XXYY 8 9 1 2 等等 所以每个头文件都以SRR51开头,然后是唯一的4位数字 比如 一种简单的bash方法: csplit -s -z -f columns sample.txt '/^SRR51/' '{*}' paste columns* > pivot.txt rm columns* 这将用于根据^SRR51模式将文件拆分为单个文件,然后使用选项卡将所有“列”分隔开来。最后,rm删除临时列文件 如果您坚持使用bsd
SRR51XXXX
5
6
7
SRR51XXYY
8
9
1
2
等等
所以每个头文件都以SRR51开头,然后是唯一的4位数字
比如
一种简单的bash方法:
csplit -s -z -f columns sample.txt '/^SRR51/' '{*}'
paste columns* > pivot.txt
rm columns*
这将用于根据^SRR51模式将文件拆分为单个文件,然后使用选项卡将所有“列”分隔开来。最后,rm删除临时列文件
如果您坚持使用bsd样式的csplit,请使用:
csplit -s -f columns sample.txt '%^SRR51%' '/^SRR51/' "{$( expr $(grep -c '^SRR51') + 1)}"
如果您希望它们“对齐”,请使用列-t
,但这不是POSIX。awk版本:
awk '/^SRR/{r=1;c++}{a[r++,c]=$1}END{while(r>i++){while(c>j++){printf "%s\t", a[i,j]}printf "\n";j=0}}' /path/to/my/file.txt
BEGIN {
field = -1
row = 0
maxrow = 0;
}
/^SRR/ {
row = 0
field++
}
{
if (!width[field] || width[field] < length($0)) {
width[field] = length($0);
}
a[row++,field] = $0;
if (row > maxrow) {
maxrow = row
}
}
END {
for (j = 0; j <= field; j++) {
printf " %-"width[j]"s ", a[0,j]
}
printf "\n";
for (i = 1; i < maxrow; i++) {
for (j = 0; j <= field; j++) {
printf(" %"width[j]"s ", a[i,j])
}
printf "\n";
}
}
开始{
字段=-1
行=0
maxrow=0;
}
/^SRR/{
行=0
场++
}
{
如果(!宽度[字段]|宽度[字段]<长度($0)){
宽度[字段]=长度($0);
}
a[行++,字段]=$0;
如果(行>最大行){
maxrow=行
}
}
结束{
对于(j=0;j是来自1个文件或3个文件的输入?请描述您如何从输入到所需输出,例如,输入标题如何不显示在输出标题中(反之亦然)?为什么有3个输入标题,但只有2个输出标题?您到底“拆分”了什么(根据您文章的主题)?请查看,然后返回并更新您的问题,并提供更多详细信息输入已经有200个文件的数据以这种方式组织。每个标题以“SRR51”开头对于垂直列出的数据。我希望输出为多列,每个标题SRR513XXX..以及列表格式的相应数据。每个标题的数据是否具有固定长度?例如每个标题有3行?@user12859525所以我理解,您有一个文件,其中包含来自大约200多个文件的o/p,并且您希望重新排列这些文件ata,标题为SRR513XXX,下面是4位数字。这是您想要的吗?如果第二列比第一列长,这将不起作用[r]也不会有足够的字段,你可以考虑在开始块中初始化R,如果文件不包含任何SRR,你的初始变体有一个讨厌的bug…-在最后一行中,2应该在第二列中。这不能提供一个问题的答案。-@suiteboyapps为什么说“这并没有提供问题的答案”?它很好用getcsplit:}:重复计数错误
输出未显示包含相应数据的列。它首先显示所有标题,然后显示一个列表中的所有数字column@IlyaKharlamov使用gnu csplit而不是bsd@user12859525列由选项卡隔开
BEGIN {
field = -1
row = 0
maxrow = 0;
}
/^SRR/ {
row = 0
field++
}
{
if (!width[field] || width[field] < length($0)) {
width[field] = length($0);
}
a[row++,field] = $0;
if (row > maxrow) {
maxrow = row
}
}
END {
for (j = 0; j <= field; j++) {
printf " %-"width[j]"s ", a[0,j]
}
printf "\n";
for (i = 1; i < maxrow; i++) {
for (j = 0; j <= field; j++) {
printf(" %"width[j]"s ", a[i,j])
}
printf "\n";
}
}