Как сделать вывод из нескольких столбцов командой awk? - PullRequest
1 голос
/ 23 июня 2019

Я использую команду 'awk', как показано ниже, которая печатает 4-й столбец всех файлов .out, содержащих 'cake':

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 ]

4 голосов
/ 23 июня 2019

Вы можете сделать это с самим awk, но я предпочитаю pr для этого

$ # -2 is number of columns needed
$ # -s option specifies delimiter, default is tab
$ seq 6 | pr -2ts','
1,4
2,5
3,6
$ seq 6 | pr -3ts','
1,3,5
2,4,6

$ # you can also change horizontal/vertical order
$ seq 6 | pr -3ats','
1,2,3
4,5,6
1 голос
/ 23 июня 2019
$ 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 о том, как сделать обратное, то есть сгенерировать количество столбцов с заданным количеством строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...