Vraag awk: pipe-uitvoer van (voorwaardelijke) print naar gzip


overweeg dit bestand:

#!/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

in het volgende script groepeer ik de rijen van dit bestand op de waarden in de eerste kolom (de waarden in de eerste kolom zijn al gesorteerd) en druk elke groep af naar een individueel txt-bestand:

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");}'

vraag

Het resultaat afdrukken naar een gecomprimeerde stream "output/"varn"_"$1".gz" (in plaats van een ongecomprimeerd txt-bestand "output/"varn"_"$1".txt")?

(dus de gewenste uitvoer is dezelfde als die de scrip nu produceert, alleen ik wil dat de uitgevoerde bestanden worden gecomprimeerd en opgeslagen .txt.gz in plaats van gewone tekst zoals de code nu doet).

(Ik probeerde het te gebruiken gzip > binnen in de {print} blokken maar tevergeefs :(

(PS Ik ben een beetje een awk noob en dus is de vraag misschien een heel stomme vraag.)


3
2017-08-18 08:34


oorsprong


Ter info, dat is a UUOC (nutteloos gebruik van Cat) en ook van echo en sed: u kunt de variabelen eenvoudig toewijzen als var='example_file.txt' en varn="{var%.txt}" - steeldriver


antwoorden:


Je kunt naar commando's in GNU-awk's pijplijnen print. Van de GNU awk handleiding:

print items | command

Het is mogelijk om via een pijp naar een ander programma te sturen   in plaats van in een bestand. Deze omleiding opent een pijp om te bevelen, en   schrijft de waarden van items via deze pijp naar een ander proces   gemaakt om het commando uit te voeren.

Het redirection-argument command is eigenlijk een rare uitdrukking. Haar   waarde wordt omgezet in een string waarvan de inhoud de shell-opdracht geeft   worden uitgevoerd. Het volgende produceert bijvoorbeeld twee bestanden, één ongesorteerd   lijst van volkernamen en één lijst in omgekeerde alfabetische volgorde   bestellen:

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

Zo:

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";}'

Bijvoorbeeld:

% echo 1 2 | awk '{print $2 | "gzip > "$1".gz"}'
% zcat 1.gz 
2

6
2017-08-18 08:54



Bedankt! Klein probleem (denk ik) met de gecorrigeerde code (kopie plakken van het blok na de So :) krijg ik awk: 1: unexpected character '.' awk: line 1: runaway string constant ");} ... - user2413