Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用grep或awk将一列拆分为多个列,标题位于原始文件标题中_Python_Bash_Awk - Fatal编程技术网

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为什么说“这并没有提供问题的答案”?它很好用get
csplit:}:重复计数错误
输出未显示包含相应数据的列。它首先显示所有标题,然后显示一个列表中的所有数字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";
    }
}