GNU/Linux >> Znalost Linux >  >> Linux

Jak sloučit dva soubory pomocí AWK?

Naštěstí to vůbec nemusíš psát. Unix má příkaz join, který to udělá za vás.

join -1 1 -2 1 File1 File2

Tady je to "v akci":

will-hartungs-computer:tmp will$ cat f1
4050 S00001 31228 3286 0
4050 S00012 31227 4251 0
4049 S00001 28342 3021 1
4048 S00001 46578 4210 0
4048 S00113 31221 4250 0
4047 S00122 31225 4249 0
4046 S00344 31322 4000 1
will-hartungs-computer:tmp will$ cat f2
4050 12.1 23.6
4049 14.4 47.8   
4048 23.2 43.9
4047 45.5 21.6
will-hartungs-computer:tmp will$ join -1 1 -2 1 f1 f2
4050 S00001 31228 3286 0 12.1 23.6
4050 S00012 31227 4251 0 12.1 23.6
4049 S00001 28342 3021 1 14.4 47.8
4048 S00001 46578 4210 0 23.2 43.9
4048 S00113 31221 4250 0 23.2 43.9
4047 S00122 31225 4249 0 45.5 21.6
will-hartungs-computer:tmp will$ 

$ awk 'FNR==NR{a[$1]=$2 FS $3;next}{ print $0, a[$1]}' file2 file1
4050 S00001 31228 3286 0 12.1 23.6
4050 S00012 31227 4251 0 12.1 23.6
4049 S00001 28342 3021 1 14.4 47.8
4048 S00001 46578 4210 0 23.2 43.9
4048 S00113 31221 4250 0 23.2 43.9
4047 S00122 31225 4249 0 45.5 21.6
4046 S00344 31322 4000 1

Vysvětlení:(Částečně na základě jiné otázky. I když trochu pozdě.)

FNR odkazuje na číslo záznamu (obvykle číslo řádku) v aktuálním souboru a NR odkazuje na celkový počet záznamů. Operátor ==je porovnávací operátor, který vrací hodnotu true, když jsou oba okolní operandy stejné. Takže FNR==NR{commands} znamená, že příkazy v závorkách byly provedeny pouze při zpracování prvního souboru (file2 teď).

FS odkazuje na oddělovač polí a $1 , $2 atd. jsou 1., 2. atd. pole v řádku. a[$1]=$2 FS $3 znamená, že slovník(/array) (pojmenovaný a ) je vyplněno $1 klíč a $2 FS $3 hodnotu.

; odděluje příkazy

next znamená, že všechny ostatní příkazy jsou pro aktuální řádek ignorovány. (Zpracování pokračuje na dalším řádku.)

$0 je celý řádek

{print $0, a[$1]} jednoduše vytiskne celý řádek a hodnotu a[$1] (pokud $1 je ve slovníku, jinak pouze $0 je vytištěno). Nyní se provádí pouze pro 2. soubor (file1 nyní), kvůli FNR==NR{...;next} .


Musíte načíst položky ze souboru 2 do dvojice asociativních polí v bloku BEGIN. Za předpokladu GNU Awk:

BEGIN { while (getline < "File 2") { f[$1] = $2; g[$1] = $3 } }

V hlavním bloku zpracování načtete řádek ze souboru 1 a vytisknete jej se správnými daty z polí vytvořených v bloku BEGIN:

{ print $0, f[$1], g[$1] }

Dodejte programu soubor 1 jako argument názvu souboru.

awk 'BEGIN { while (getline < "File 2") { f[$1] = $2; g[$1] = $3 } }
     print $0, f[$1], g[$1] }' "File 1"

Uvozovky kolem argumentu názvu souboru jsou nutné kvůli mezerám v názvu souboru. Potřebujete uvozovky kolem getline název_souboru, i když neobsahoval žádné mezery, protože jinak by to byl název proměnné.


Linux
  1. Jak vytvořit soubory Linux Proc v programu C pomocí LKM

  2. Jak vytvořit řídké soubory v Linuxu pomocí příkazu „dd“.

  3. Jak extrahovat soubory bez struktury složek pomocí tar

  1. Jak nahrát soubory pomocí Správce souborů v Cpanel

  2. jak spojit dva soubory konzistentně řádek po řádku

  3. Jak připojit/sloučit mnoho souborů mp3?

  1. wget vs curl:Jak stahovat soubory pomocí wget a curl

  2. Ručně sloučit dva soubory pomocí diff

  3. Sloučit dva soubory HTML do hlavního souboru HTML