当有空白列时将列拆分为多列

当有空白列时将列拆分为多列

我需要一些帮助:

A
B
C

1
2

Q
W
A

每当我们发现空白列时,就将该列拆分为新列。

输出:

A,1,Q   
B,2,W
C,,A

我使用过 Sed,但找不到要分割的关键字。由于我有大量数据,有没有办法有效地做到这一点。

谢谢

答案1

$ csplit -zsf file ip.txt /^$/+1 {*}
$ paste -d, file* | head -n -1
A,1,Q
B,2,W
C,,A

来自手册:

分割- 将文件分割为由上下文行确定的部分

-z, --elide-空文件删除空输出文件

-s,--安静,--沉默不打印输出文件大小的计数

-f, --prefix=前缀使用 PREFIX 代替 'xx'

粘贴- 合并文件行

-d, --delimiters=列表重用 LIST 中的字符而不是 TAB

head -n -1用于删除最后一行,也可以使用sed '$d'

答案2

$ cat tst.awk
BEGIN { RS=""; FS="\n"; OFS="," }
{
    numRows = (NF>numRows ? NF : numRows)
    numCols = colNr = NR
    for (rowNr=1; rowNr<=NF; rowNr++) {
        vals[rowNr,colNr] = $rowNr
    }
}
END {
    for (rowNr=1; rowNr<=numRows; rowNr++) {
        for (colNr=1; colNr<=numCols; colNr++) {
            printf "%s%s", vals[rowNr,colNr], (colNr<numCols ? OFS : ORS)
        }
    }
}

$ awk -f tst.awk file
A,1,Q
B,2,W
C,,A

上面将所有输入存储在内存中,因此 YMMV 取决于您所说的“巨大”的含义I have huge data- 如果它只是像您的输入一样的几百万个空行分隔的块,那就没问题,但如果它是 TB 的数据,那么可能就不行。

相关内容