GNU/Linux >> Znalost Linux >  >> Linux

Smazat po sobě jdoucí řádky v CSV s duplicitními hodnotami v jednom poli, ale ponechat poslední řádek?

Mám dlouhý soubor CSV se dvěma sloupci, který obsahuje série po sobě jdoucích duplikátů, jako je tento:

...
1500,1533
1554,1678
1554,1703
1554,1728
1593,1766
...

Potřebuji odstranit všechny tyto duplikáty kromě posledního – takže výstup pro příklad výše by byl:

...
1500,1533
1554,1728
1593,1766
...

Také musím zachovat zbytek řádků v souboru v jejich původním pořadí.

Zkoušel jsem tac file.csv | sort -k1,1 -r -u -t,

ale to nepřineslo požadovaný výsledek a funkce založené na řazení mi zkazily pořadí řádků.

Přijatá odpověď:

S sed :

sed '$!N;/\(.*,\).*\n\1/!P;D' infile

N znamená, že v prostoru vzoru jsou vždy dva po sobě jdoucí řádky a sed P vypíše první z nich pouze v případě, že první pole na tomto řádku není stejné jako první pole na druhém řádku. Poté D odstraní první řádek z prostoru vzoru a restartuje cyklus.

Jiný způsob s gnu datamash (za předpokladu, že je váš soubor seřazen jako datamash vyžaduje tříděný vstup):

datamash -t ',' -g 1 last 2 <infile

Tento g sloučí , vstup oddělený 1 st pole, tiskne pouze last hodnota (od 2 nd sloupec) každé skupiny.

Pokud váš soubor není seřazený, datamash lze jej třídit pomocí -s :

datamash -t ',' -s -g 1 last 2 <infile

ale to znamená, že počáteční pořadí řádků nebude zachováno. Takže to nemusí dělat to, co chcete. V takovém případě můžete použít sed /awk /perl atd…


Linux
  1. Nástroj pro získání řádků v jednom souboru, které nejsou v jiném?

  2. Vložit nové řádky s chybějícími hodnotami (ne)?

  3. Ponechat pouze první řádek z každé sekvence po sobě jdoucích řádků, které odpovídají vzoru?

  1. Najít věk nejstaršího souboru na jednom řádku nebo vrátit nulu?

  2. Duplicitní, s několika malými změnami, několika řádky v textovém souboru?

  3. Vytiskněte poslední řádek souboru z CLI

  1. Řazení na posledním poli řádku

  2. Jak použít sed k odstranění posledních n řádků souboru

  3. Jak vytisknout poslední řádek komprimovaného souboru gz na příkazovém řádku?