Liittymisenesto- tai käänteisliittäminen bashissa

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

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äminen grep on hienoa antamastani lelutiedoista. Kiitos! Reaalimaailmassa tiedostossa1 on usein useita tietosarakkeita, joista yhtä käytetään liittämiseen. Muokattu versio awk koodi osoittaisi tämän käyttötapauksen.
  • @Josh kyllä, muuta vain $0 muotoon $N missä N on 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 

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *