2014-11-10 12 views
8

Sto usando il comando di sotto per unire due file usando le prime due colonne.AWK per utilizzare più spazi come delimitatore

awk 'NR==FNR{a[$1,$2]=substr($0,3);next} ($1,$2) in a{print $0, a[$1,$2] > "br0102_3.txt"}' br01.txt br02.txt 

Ora, per impostazione predefinita, il comando AWk utilizza gli spazi bianchi come separatori. Ma il mio file può contenere uno spazio singolo tra due parole, ad es.

File 1:

ABCD    TEXT1 TEXT2      123123112312312312312312312312312312 
BCDEFG    TEXT3TEXT4      133123123123123123123123123125423423 
QWERT    TEXT5TEXT6      123123123123125456678786789698758567 

File 2:

ABCD    TEXT1 TEXT2      12312312312312312312312312312 
BCDEFG    TEXT3TEXT4      31242342342342342342342342343 
MNHT    TEXT8 TEXT9      31242342342342342342342342343 

voglio il file dei risultati come;

ABCD    TEXT1 TEXT2      123123112312312312312312312312312312 12312312312312312312312312312 
BCDEFG    TEXT3TEXT4      133123123123123123123123123125423423 31242342342342342342342342343 
QWERT    TEXT5TEXT6      123123123123125456678786789698758567 
MNHT    TEXT8 TEXT9      31242342342342342342342342343 

Eventuali suggerimenti?

risposta

19

awk supporta un'espressione regolare come valore di FS in modo da poter specificare un'espressione regolare che corrisponda ad almeno due spazi. Qualcosa come -F '[[:space:]][[:space:]]+'.

$ awk '{print NF}' File2 
4 
3 
4 

$ awk -F '[[:space:]][[:space:]]+' '{print NF}' File2 
3 
3 
3 
+0

grande! funziona, ora sto usando il comando 'awk -F '[[: space:]] [[: space:]] +' 'NR == FNR {a [$ 1, $ 2] = $ 3; successivo} ($ 1, $ 2) in {print $ 0, a [$ 1, $ 2]> "br0102_4.txt"} 'br01.txt br02.txt'. Ma tra la concatenazione dei record dei due file per qualsiasi riga, vedo un carattere LF Feed di linea, qualche suggerimento su come evitarlo? Quindi le righe unite sono divise in due righe. – Apurv

+0

'print $ 0, a [$ 1, $ 2]' deve essere in uscita la riga dal secondo file seguito da 'OFS' (spazio per impostazione predefinita) e quindi il valore di' a [$ 1, $ 2] seguito da 'ORS' (newline di default). Il tuo primo file di input è forse un file newline DOS? –

+0

Questo mi ha aiutato ad analizzare l'output di un comando di sistema che utilizza sempre almeno 2 spazi per delineare le colonne, quindi grazie mille! – dragon788

4

Si utilizza campi a larghezza fissa in modo si dovrebbe utilizzare FIELDWIDTHS awk gnu (o simile) per separare i campi, per esempio se il 2 ° campo è il 15 caratteri da char 8 a char 23 incluso in questo file:

$ cat file 
abc def ghi  klm 
AAAAAAAB C D E F G H IJJJJ 
abc  def ghi  klm 

$ awk -v FIELDWIDTHS="7 15 4" '{print "<" $2 ">"}' file 
<def ghi  > 
<B C D E F G H I> 
< def ghi  > 

Qualsiasi soluzione che si basa su un certo numero di spazi tra i campi non riuscirà quando si dispone di 1 o pari a zero spazi tra i campi .

Se si vuole mettere a nudo leader/spazi finali dal campo di destinazione (s):

$ awk -v FIELDWIDTHS="7 15 4" '{gsub(/^\s+|\s+$/,"",$2); print "<" $2 ">"}' file 
<def ghi> 
<B C D E F G H I> 
<def ghi> 
Problemi correlati