2012-11-13 17 views
10

Ich mag würde filein.txt (tab getrennt) und zum Ausgeben eines fileout.txt mit nur Zeilen lesen, die den Wert einer gegebenen Spalte entsprechen, und eliminiere die Spalte, die abgefragt wird. dhawk einzeiler wählt nur Zeilen basierend auf dem Wert einer Spalte

filein.txt 
#name\thouse\taddress 
roger\tvictorian\t223 dolan st. 
maggie\tfrench\t12 alameda ave. 
kingston\tvictorian\t224 house st. 
robert\tamerican\t22 dolan st. 

Lassen Sie uns sagen, dass ich nur die Zeilen auswählen möchten, wo die Häuser sind von victorian Stil, dann meine fileout.txt sollte folgendermaßen aussehen:

fileout.txt 
#name\taddress 
roger\t223 dolan st. 
kingston\t224 house st. 

Antwort

23
awk -F"\t" '$2 == "victorian" { print $1"\t"$3 }' file.in 
+2

+1.Anstatt die Registerkarte in der print-Anweisung hart zu codieren, können Sie auch 'print $ 1 FS $ 3' schreiben. Angelegenheit der Vorliebe nur. –

8

Sie tun können wurde sie mit folgendem awk Skript:

#!/bin/bash 

style="victorian" 
awk -v s_style=$style 'BEGIN{FS=OFS="\t"} 
    $2==s_style {$2=""; sub("\t\t","\t"); print}' 

Erläuterung:

  • style="victorian": weisen Sie den Stil des Hauses, die Sie außerhalb des awk Skript auswählen möchten, so dass es einfacher ist,
  • awk zu halten: aufrufen awk
  • -v s_style=$style: die -v Option übergibt eine externe Variable in awk. Sie müssen dies für jede Variable angeben, die Sie übergeben. In diesem Fall weist sie die externe Variable $style der awk-Variablen s_style zu.
  • BEGIN{FS=OFS="\t"}: teilt awk mit, dass die Feldtrennzeichen in der Ausgabe Tabulatoren sein sollten, nicht Leerzeichen standardmäßig.
  • {$2==s_style {$2=""; sub("\t\t","\t"); print}}': Wenn das zweite Feld der in s_style (in diesem Fall victorian) angegebene Haustyp ist, entfernen Sie es und drucken Sie die Zeile.

Alternativ, könnten Sie tun:

#!/bin/bash 

style="victorian" 
awk -v s_style=$style 'BEGIN{FS=OFS="\t"} 
    $2==s_style {print $1, $3}' 

aber dies setzt voraus, dass Ihre Eingabedateien zusätzliche Felder nicht durch Tabulatoren in Zukunft getrennt haben.

+3

+1. Einfach aus Gründen des Stils würde ich FS mit BFS im BEGIN-Block definieren und die if-Anweisung entfernen: 'awk -vs = $ style 'BEGIN {FS = OFS =" \ t "} $ 2 == s {print $ 1 , $ 3} '' –

+0

@glennjackman thanks =) Ich bin noch neu in Shell-Skripten; meine Antwort bearbeitet, um Ihre Kommentare zu reflektieren –

+1

Ich habe die Syntaxfehler bei der letzten Bearbeitung behoben. Mit awk besteht der Text aus CONDITION {ACTION} -Paaren, wobei der ACTION-Body nur ausgeführt wird, wenn die CONDITION den Wert true zurückgibt. Der BEGIN-Block ist nur wahr, bevor die erste Eingabezeile gelesen wird, und wir wollen nur drucken, wenn die Bedingung "$ 2 == s" wahr zurückgibt. –

1

die OFS (Ausgabefeld Separator) Variable verwenden, können Sie harte Codierung zwischen den Zeilen vermeiden:

awk -F"\t" -v OFS="\t" '$2 == "victorian" { print $1,$3 }' file.in 
Verwandte Themen