Existuje nějaký nástroj, který dokáže získat řádky, které soubor A obsahuje, ale soubor B nikoli? Mohl bych vytvořit malý jednoduchý skript, např. pomocí perlu, ale pokud už něco takového existuje, ušetřím si odteď čas.
Přijatá odpověď:
Ano. Standardní grep
nástroj pro vyhledávání textových řetězců v souborech lze použít k odečtení všech řádků v jednom souboru od druhého.
grep -F -x -v -f fileB fileA
Funguje to tak, že se každý řádek v souboru B použije jako vzor (-f fileB
) a považovat jej za prostý řetězec, který se má shodovat (nikoli běžný regulární výraz) (-F
). Vynutíte shodu na celém řádku (-x
) a vytiskněte pouze řádky, které se neshodují (-v
). Proto tisknete řádky v souboru A, které neobsahují stejná data jako kterýkoli řádek v souboru B.
Nevýhodou tohoto řešení je, že nebere v úvahu pořadí řádků, a pokud váš vstup obsahuje duplicitní řádky na různých místech, nemusíte dostat to, co očekáváte. Řešením je použít skutečný porovnávací nástroj, jako je diff
. Můžete to udělat vytvořením souboru rozdílu s hodnotou kontextu na 100 % řádků v souboru a jeho analýzou pouze pro řádky, které by byly odstraněny při převodu souboru A na soubor B. (Všimněte si také tohoto příkazu odstraní formátování rozdílu poté, co dostane správné řádky.)
diff -U $(wc -l < fileA) fileA fileB | sed -n 's/^-//p' > fileC