awk: вывод канала (условной) печати к gzip

рассмотрите этот файл:

#!/usr/bin/env bash
cat > example_file.txt <<EOL
group, value
1, 3.21
1, 3.42
1, 3.5
2, 4.1
2, 4.2
EOL

в следующем сценарии я группирую строки этого файла значениями в первом столбце (значения в первом столбце уже отсортированы), и распечатайте каждую группу в отдельный txt файл:

var=$(echo 'example_file.txt')
var2=$(echo $var|sed "s/.txt//g")
mkdir -p output
cat $var | awk -v varn="$var2" -F, 'FNR == 1 {header = $0;next} !seen[$1]++ { print header > ("output/"varn"_"$1".txt") }{print > ("output/"varn"_"$1".txt");}'

вопрос

Как распечатать результат к сжатому потоку "output/"varn"_"$1".gz" (вместо несжатого txt файла "output/"varn"_"$1".txt")?

(таким образом, желаемый вывод совпадает с этим, документ на получение производит теперь, только я хочу, чтобы произведенные файлы были сжаты и сохранены к .txt.gz вместо простого текста, поскольку код делает теперь).

(Я пытался использовать gzip > в {print} блоки, но напрасно :(

(PS, я - что-то вроде awk новичок и так вопрос, могла бы быть действительно немой.)

3
задан 18 August 2018 в 11:39

1 ответ

Можно передать по каналу к командам в awk's GNU print. От GNU awk руководство:

print items | command

Возможно отправить вывод в другую программу через канал вместо в файл. Это перенаправление открывает канал для управления и пишет значения объектов через этот канал к другому процессу, созданному для выполнения команды.

Аргумент перенаправления command на самом деле awk выражение. Его значение преобразовывается в строку, содержание которой дает команду оболочки, которая будет выполнена. Например, следующее производит два файла, один неотсортированный список имен народов и один список, отсортированный в обратном алфавитном порядке:

awk '{ print $1 > "names.unsorted"
       command = "sort -r > names.sorted"
       print $1 | command }' mail-list

Так:

awk -v varn="$var2" -F, 'FNR == 1 {header = $0;next}
  !seen[$1]++ { print header | "gzip > "output/"varn"_"$1".gz" }
  {print | "gzip > output/"varn"_"$1".gz";}'

Например:

% echo 1 2 | awk '{print $2 | "gzip > "$1".gz"}'
% zcat 1.gz 
2
6
ответ дан 1 December 2019 в 15:21

Другие вопросы по тегам:

Похожие вопросы: