рассмотрите этот файл:
#!/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 новичок и так вопрос, могла бы быть действительно немой.)
Можно передать по каналу к командам в 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