使用awk将大型复杂的一列文件拆分为多个列

Edo*_*IFP 4 bash awk field rows

我有一个由一些商业软件生成的文本文件,如下所示.它由括号分隔的部分组成,每个部分都有数百万个元素,但确切的值会从一个案例变为另一个案例.

(1
 2
 3
...
)
(11
22
33
...
)
(111
222
333
...
)
Run Code Online (Sandbox Code Playgroud)

我需要实现如下输出:

 1;  11;   111
 2;  22;   222
 3;  33;   333
...  ...  ...
Run Code Online (Sandbox Code Playgroud)

我发现了一种复杂的方式:

我觉得这很糟糕,因为我循环了几百万行.即使返回时间非常好(约80秒),我也想找到一个完整的awk解决方案,但无法实现.就像是:

awk 'BEGIN{RS="(\\n)"; OFS=";"} { print something } '
Run Code Online (Sandbox Code Playgroud)

我发现了一些相关的问题,特别是用awk进行的一行到列的转换,但它假设括号之间有一定数量的行,我不能这样做.

任何帮助,将不胜感激.

Ed *_*ton 5

使用GNU awk实现多字符RS和真正的多维数组:

$ cat tst.awk
BEGIN {
    RS  = "(\\s*[()]\\s*)+"
    OFS = ";"
}
NR>1 {
    cell[NR][1]
    split($0,cell[NR])
}
END {
    for (rowNr=1; rowNr<=NF; rowNr++) {
        for (colNr=2; colNr<=NR; colNr++) {
            printf "%6s%s", cell[colNr][rowNr], (colNr<NR ? OFS : ORS)
        }
    }
}

$ awk -f tst.awk file
     1;    11;   111
     2;    22;   222
     3;    33;   333
   ...;   ...;   ...
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.对于你的下一个问题 - 接受你得到的第一个答案并不是一个好主意,因为它不鼓励人们发布其他答案.如果你非常幸运,第一个答案是最好的答案,那么你很高兴,但如果你没那么幸运......现在可能还有其他人可以提供更好的答案(也许比我的更好)或者到目前为止发布的任何其他人)看着你的问题,看到你已经接受了答案,继续前进.只是在说'.... (4认同)
  • @RavinderSingh13所以每个组合的单个或成对的`)和`(`被视为一个RS,因此它在文件的末尾单独捕获`(在文件的开头单独`和`)\n`以及每个`\n)\n(`在它的中间对. (2认同)