如何使用“ awk”命令进行多列输出?

时间:2019-06-23 04:43:11

标签: awk

我正在使用如下所示的“ awk”命令,该命令将显示所有包含“ cake”的.out文件的第4列:

awk '/cake/{print $4}' ./*/*.out

我的输出是一列,例如:

1
2
3
4
5
6

如何将其重新格式化为类似于以下内容的内容:

1 4  
2 5  
3 6 

1 3 5
2 4 6

即具有一定数量的列元素(在上述情况下为3和2)。

更好的是,我可以在同一命令中将其作为csv文件吐出吗?

谢谢。

2 个答案:

答案 0 :(得分:4)

您可以自己使用scheduler.enterabs(time, priority, action, argument=(), kwargs={})来做到这一点,但是我更喜欢awk

pr

答案 1 :(得分:1)

$ cat tst.awk
{ a[NR] = $0 }
END {
    OFS = ","
    numCols = (numCols ? numCols : 1)
    numRows = ceil(NR / numCols)
    for ( rowNr=1; rowNr<=numRows; rowNr++ ) {
        for ( colNr=1; colNr<=numCols; colNr++ ) {
            idx = rowNr + ( (colNr - 1) * numRows )
            printf "%s%s", a[idx], (colNr<numCols ? OFS : ORS)
        }
    }
}
function ceil(x, y){y=int(x); return(x>y?y+1:y)}

$ awk -v numCols=2 -f tst.awk file
1,4
2,5
3,6

$ awk -v numCols=3 -f tst.awk file
1,3,5
2,4,6

请注意,即使您输入的行数不是您想要的列数的精确倍数,上面的命令仍然有效(请注意,即使有空字段的行中也有3个逗号分隔的字段):

$ seq 10 | awk -v numCols=3 -f tst.awk
1,5,9
2,6,10
3,7,
4,8,

有关相反的操作,请参见https://stackoverflow.com/a/56725768/1745001,即在指定行数的情况下生成一定数量的列。