2010-05-25 1 views

risposta

15

È necessario impostare specificamente il separatore di campo a un TAB carattere:

> cat qq.in 
    foo  78  xxx 
    bar    yyy 
    qux  99  zzz 
    xuq    xyz 
> cat qq.in | awk 'BEGIN {FS="\t"} $2=="" {print}' 
    bar    yyy 
    xuq    xyz 

Il comportamento predefinito per awk è quello di trattare un FS di SPACE (predefinito) come caso speciale. Dalla pagina man:

Nel caso particolare che FS è un unico spazio, i campi sono separati da piste di spazi e/o tabulazioni e/o ritorni a capo. (corsivo mio)

+5

È possibile specificare la scheda char come opzione awk e non nella clausola BEGIN . Questa è la sintassi di bash per un tab char: 'awk -F $ '\ t' '$ 2 ==" "' file ...' –

3
grep -e '^.*\t\t.*$' myfile.txt 

Will grep ogni linea composta da personaggi-tab-tab-personaggi (nulla tra le schede).

+1

@daotoad: ha detto "estrai le righe dove la colonna 2 è vuota". Se vuole che SOLO column2 sia vuoto, deve specificare come tale. In tal caso, sostituire. * Con l'intervallo di caratteri validi (o una inversione di intervallo di caratteri non consentiti). Forse [^ \ t] farà. Dipende dalle sue specifiche! – Konerak

+1

In realtà, @daotoad, in un file a 3 colonne, penso che l'unico modo per ottenere due schede consecutive sia che la colonna due sia vuota indipendentemente dallo stato delle colonne uno o tre. Quindi questa risposta mi sembra ancora valida. – paxdiablo

+1

Sì, gratta il mio commento precedente. Le due schede possono verificarsi solo su un "blank interno". In altre parole su una tabella di colonne N (dove N> = 3) possono verificarsi sulle colonne da 2 a N-1. Dato che abbiamo una tabella a tre colonne, significa solo 2. Il delimitatore sulle colonne finali è una nuova riga o l'inizio/la fine del file. L'errore dimostra che è passata la mia ora di andare a letto. Ci scusiamo per l'errore. – daotoad

5
perl -F/\t/ -lane 'print unless $F[1] eq q//' myfile.txt 

di comando

  • -F dice Perl cosa delimitatore per AutoSplit su (schede in questo caso)
  • -a abilita la modalità autosplit, dividendo ciascuna riga delimitatore specificato per compilare una matrice @F
  • -l aggiunge automaticamente una nuova riga "\n" alla fine di ogni terminale Ted linea
  • -n elabora il file linea per linea
  • -e tratta del primo argomento citato come codice e non un nome di file
+1

Ottimo lavoro con autosplit!Mi dimentico sempre e finisco per scrivere piccole sceneggiature quando una sola fodera lo farebbe. Non dovrebbe essere 'print if $ F [1] eq '''? Altrimenti, verrà stampata una colonna come 'aaa 0 bbb'. Inoltre, per la mia shell/perl, l'opzione '-F' deve essere' -F '\ t'' o '-F" \ t "', non gli piace '-F/\ t /' nonostante quale perlrun dice. Posso aggirare l'interpolazione con '-F =/\\ t /', ma è piuttosto brutto. – daotoad