Unione di colonne da due file separati


10

Come creare un nuovo file unendo colonne selettive da due file separati usando awk? Senza incasinare gli elementi degli ordini di ENTRAMBI i file.

Esempio: il file 3 può contenere la colonna 1,2,3 dal file 1 e la colonna 4 dal file 2.

File 1
A   23  8   T
A   63  9   9
B   45  3   J

File 2
A   0
A   6   
B   5

File 3
A   23  8   0
A   63  9   6
B   45  3   5

Risposte:


4

Prova questo:

$ awk 'FNR==NR{a[FNR]=$2;next};{$NF=a[FNR]};1' file2 file1
A 23 8 0
A 63 9 6
B 45 3 5

Grazie! Ho anche provato con successo questa via usando gawk:pr -m -t -s\ File1.txt File2.txt | gawk '{print $1,$2,$3, $6}' > File3.txt
dovah,

2
@Dovah: è possibile utilizzare paste file1 file2e quindi stampare i campi selezionati in awk.
cuonglm,

Questo memorizza file2in memoria, che può essere proibitivo se i file sono di grandi dimensioni. C'è un modo più semplice per farlo senza l'overhead della memoria (vedi la mia risposta).
Gilles 'SO- smetti di essere malvagio' il

17

C'è uno strumento dedicato che: paste. Concatena ogni riga completa del primo file con la riga corrispondente del secondo file; puoi rimuovere colonne indesiderate prima o dopo. Ad esempio, supponendo che le colonne siano delimitate da tabulazioni:

paste file1.txt file2.txt | cut -f 1,2,3,6

Ecco un modo per pre-filtrare entrambi i file che si basa sulla sostituzione del processo ksh / bash / zsh.

paste <(<file1.txt sed 's/[[:space:]][[:space:]]*[^[:space:]]*$//') \
      <(<file1.txt sed 's/^[^[:space:]]*[[:space:]][[:space:]]*//')

Awk è principalmente orientato all'elaborazione di un file alla volta, ma è possibile chiamare getlineper leggere da un altro file in parallelo.

awk '
  BEGIN {file2=ARGV[2]; ARGV[2]="";}
  {$0 = $0 ORS getline(); print $1, $2, $3, $6;}
' file1.txt file2.txt

Finora ho assunto che tu voglia abbinare la linea 1 del file 1 con la linea 1 del file 2, la linea 2 del file 1 con la linea 2 del file 2, ecc. Se vuoi abbinare il contenuto di una colonna, è un questione completamente diversa. joinfarà il lavoro a condizione che la colonna che si desidera abbinare sia ordinata.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.