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äminengrep
on hienoa antamastani lelutiedoista. Kiitos! Reaalimaailmassa tiedostossa1 on usein useita tietosarakkeita, joista yhtä käytetään liittämiseen. Muokattu versioawk
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