使用grep或awk将一列拆分为多个列,标题位于原始文件标题中

2024-09-29 17:22:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下输出

SRR51XXXX
5
6
7
SRR51XXYY
8
9
1
2

等等

所以每个头文件都以SRR51开头,然后是唯一的4位数字 比如

SRR513XXXX            SRR513XXXY 
5                        8
6                        9
7                        1

Fig to show the data


Tags: thetodata头文件showfig数字srr513xxxx
3条回答

一种简单的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)}"

如果您想让它们“对齐”,请使用column -t,但这不是POSIX

awk版本:

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";
    }
}

要运行,请保存到col.awk文件中,然后运行awk -f col.awk sample.txt

注意:标题左对齐,数字右对齐

在线演示-https://ideone.com/H6hUcq

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

相关问题 更多 >

    热门问题