GNU/Linux >> Znalost Linux >  >> Linux

Odebrat řádky na základě duplikátů v rámci jednoho sloupce bez řazení?

Mám velké soubory se 3 sloupci (~10 000 řádků) a rád bych odstranil řádky, když se obsah třetího sloupce tohoto řádku objeví ve třetím sloupci jiného řádku. Velikosti souborů způsobují, že řazení je trochu těžkopádné a nemohu použít něco jako níže uvedený kód, protože celé řádky nejsou identické; pouze obsah sloupce 3.

awk '!seen[$0]++' filename

Přijatá odpověď:

Jednoduše změňte příkaz awk na sloupec, ze kterého chcete odstranit duplicitní řádky na základě tohoto sloupce (ve vašem případě třetí sloupec):

awk '!seen[$3]++' filename

Tento příkaz říká awk které řádky vytisknout. Proměnná $3 obsahuje celý obsah sloupce 3 a hranaté závorky jsou přístupem k poli. Takže pro každý třetí sloupec řádku v názvu souboru je uveden uzel pole s názvem seen se zvýší a řádek se vytiskne, pokud obsah tohoto uzlu (sloupec3) nebyl (! ) dříve nastavené.

Výše uvedené bude fungovat, pokud jsou vaše sloupce ve vstupním souboru odděleny mezerami/tabulátory, pokud je to něco jiného, ​​budete mu muset říct, aby awk pomocí -F volba. Pokud jsou tedy například sloupce oddělené čárkou (, ) a chce odstranit řádky založené na třetím sloupci, použijte následující příkaz:

awk -F',' '!seen[$3]++' filename

Linux
  1. Jak odstranit duplicitní řádky uvnitř textového souboru?

  2. Jak odstranit duplikáty v .bash_history, zachování pořádku?

  3. Odstranit duplicitní hodnoty v poli?

  1. Seřadit výstup podle sloupce?

  2. Odstraňte prázdné řádky v textovém souboru pomocí grep

  3. Odstraňte liché nebo sudé řádky z textového souboru

  1. Jak znovu načíst pravidla Udev bez restartu?

  2. Výpis řádků pouze z jednoho souboru v DIFF

  3. Odstraňte všechny symbolické odkazy souborů jedním příkazem