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