2013-02-10 17 views
6

sto lavorando il seguente script bash:bash awk prima prima colonna e 3 ° colonna con tutto dopo

# contents of dbfake file 
1 100% file 1 
2 99% file name 2 
3 100% file name 3 

#!/bin/bash 

# cat out data 
cat dbfake | 

# select lines containing 100% 
grep 100% | 

# print the first and third columns 
awk '{print $1, $3}' | 

# echo out id and file name and log 
xargs -rI % sh -c '{ echo %; echo "%" >> "fake.log"; }' 

exit 0 

Questo script funziona bene, ma come faccio a stampare tutto nella colonna $ 3 e quindi tutte le colonne dopo?

risposta

11

È possibile utilizzare tagliare invece di awk in questo caso:

cut -f1,3- -d ' ' 
8
awk '{ $2 = ""; print }' # remove col 2 
1

Se non ti dispiace un po 'di spazio bianco:

awk '{ $2="" }1' 

Ma UUOC e grep:

< dbfake awk '/100%/ { $2="" }1' | ... 

Se vuoi tagliare che gli spazi bianchi:

< dbfake awk '/100%/ { $2=""; sub(FS "+", FS) }1' | ... 


Per divertimento, ecco un altro modo con GNU sed:

< dbfake sed -r '/100%/s/^(\S+)\s+\S+(.*)/\1\2/' | ... 
0

Altri hanno risposto in vari modi, ma voglio puntare sul fatto che l'uso di xargs sull'output multiplex sia un'idea piuttosto pessima.

Invece, perché non:

awk '$2=="100%" { sub("100%[[:space:]]*",""); print; print >>"fake.log"}' dbfake 

Questo è tutto. Non hai bisogno di grep, non hai bisogno di più pipe, e sicuramente non hai bisogno di fork shell per ogni linea che stai trasmettendo.

Si potrebbe fare awk ...; print}' | tee fake.log, ma non c'è molto punto nel tee di forking, se può essere gestito anche da awk.

0

Tutto ciò che serve è:

awk 'sub(/.*100% /,"")' dbfake | tee "fake.log" 
Problemi correlati