![当有空白列时将列拆分为多列](https://linux22.com/image/179624/%E5%BD%93%E6%9C%89%E7%A9%BA%E7%99%BD%E5%88%97%E6%97%B6%E5%B0%86%E5%88%97%E6%8B%86%E5%88%86%E4%B8%BA%E5%A4%9A%E5%88%97.png)
我需要一些帮助:
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 的数据,那么可能就不行。