2013-02-10 11 views
6

ich auf dem folgenden Bash-Skript arbeite:bash awk ersten ersten Spalte und 3. Spalte mit allem, was nach

# 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 

Dieses Skript funktioniert ok, aber wie kann ich drucken alles in Spalte 3 $ und dann, nachdem alle Spalten?

Antwort

11

Sie können in diesem Fall statt awk geschnitten verwenden:

cut -f1,3- -d ' ' 
1

Wenn Sie nicht ein wenig Leerzeichen dagegen:

awk '{ $2="" }1' 

Aber UUOC und grep:

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

Wenn Sie diese Leerzeichen trimmen möchten:

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


Für Spaß, hier ist eine andere Art und Weise mit GNU sed:

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

Andere auf verschiedene Weise reagiert, aber ich möchte Zeigen Sie, dass die Verwendung von Xargs zum Multiplexen der Ausgabe eine ziemlich schlechte Idee ist.

Stattdessen warum nicht Sie:

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

Das ist alles. Sie brauchen kein grep, Sie brauchen nicht mehrere Pipes, und definitiv müssen Sie Shell für jede Zeile, die Sie ausgeben, nicht forkieren.

Sie könnten awk ...; print}' | tee fake.log tun, aber es gibt nicht viel Sinn in Forking Tee, wenn awk auch damit umgehen kann.

0

Alles, was Sie brauchen, ist:

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