Haluan suorittaa sen, mitä jotkut data-analyysiohjelmistot kutsuvat liittymisenestoksi: poista yhdestä luettelosta nämä rivit vastaavat rivit toisessa luettelossa. Tässä on joitain lelutietoja ja odotettua tulosta:
$ echo -e "a\nb\nc\nd" > list1 $ echo -e "c\nd\ne\nf" > list2 $ antijoincommand list1 list2 a b
Kommentit
- Liittyvät unix.stackexchange.com/q/11343/117549
- Vastaako tämä kysymykseesi? Onko olemassa työkalu, jolla saadaan tiedostoon ne rivit, jotka eivät ole toisessa?
- @Muru, kyllä, tuo viesti tarjoaa ratkaisut esitetty Terdon ' -vastauksessa. Kun etsin kuitenkin " bash anti-join " (terminologia, jonka liitän tällaiseen prosessiin), en div id = ”9dd11583f9″>
t löydä mitään hyödyllistä. OP-toiminnassani (jota muut ovat muokkaaneet) todettiin, että nimenomaisena tarkoituksenani tämän kysymyksen esittämisessä oli liittää termi " liittymisen esto " ratkaisuja, niin että termillä etsiminen tuottaa nämä ratkaisut. Kiitos.
Vastaa
En käytä join tähän, koska join vaatii syötteen lajittelun, mikä on tarpeetonta komplikaatiota tällaiselle yksinkertaiselle työlle. Voit sen sijaan käyttää grep:
$ grep -vxFf list2 list1 a b
Tai awk:
$ awk "NR==FNR{++a[$0]} !a[$0]" list2 list1 a b
Jos tiedostot on jo lajiteltu, vaihtoehdoksi join -v 1 olisi comm -23
$ comm -23 list1 list2 a b
kommentit
-
sort-kohdan välttäminengrepon hienoa antamastani lelutiedoista. Kiitos! Reaalimaailmassa tiedostossa1 on usein useita tietosarakkeita, joista yhtä käytetään liittämiseen. Muokattu versioawkkoodi osoittaisi tämän käyttötapauksen. - @Josh kyllä, muuta vain
$0muotoon$NmissäNon kentän numero, johon olet liittymässä. - Tämä toimii, vaikka tiedoston1 ja tiedoston2 sarakkeiden numerot ovat erilaiset: kuten awk ' NR == FNR {++ a [$ 2]}! a [$ 5] ' lista2 luettelo1; melko tavallista, että tunnistetiedosto on eri muodossa kuin päätiedot.
Vastaa
Yksi tapa tee tämä join -apuohjelmalla:
$ join -v 1 list1 list2 a b