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…