Kysymys:
bcftools suodattaa kaikki hakemiston tiedostot
Joanne
2018-12-01 05:03:51 UTC
view on stackexchange narkive permalink

Luultavasti typerä valvonta minulta, mutta yritän suodattaa kaikki hakemiston vcf: t bcftools-sovelluksella yksinkertaisen silmukan avulla. Peruskomentoni toimii hyvin:

  bcftools filter -i 'QUAL > 1000' -o filter / file1out.vcf file1in.vcf 

mutta kun yritä silmukata sitä, se toistaa jokaisen tiedostonimen, mutta ei tuota tulostustiedostoja tai virheilmoituksia.

  f: lle * .vcf: ssä; do echo "filtering  $ f"; bcftools filter -i 'QUAL > 1000' -o filter / $  f_out.vcf $ f; valmis  

Enkö käsittele tulosuuntaa oikein? Apua arvostetaan suuresti!

Kolme vastused:
Wouter De Coster
2018-12-01 15:57:57 UTC
view on stackexchange narkive permalink

Oletan, että shellisi etsii muuttujaa $ f_out , mutta ei löydä sitä, koska et määrittänyt sitä. Se luultavasti loi piilotetun tiedoston nimeltä .vcf lähtöhakemistossa.

Käytä sen sijaan seuraavaa: -o $ {f} _out.vcf . Tämä "suojaa / rajoittaa" bash-muuttujan vain arvoon $ f eikä $f_out.

Kun kohtaat tällaisia ​​ongelmia, se on kannattaa laittaa echo -silmukkaasi juuri ennen komentoasi, tässä tapauksessa bcftools (lisäämällä lainausmerkkejä tarvittaessa). Se osoittaisi komennon, miten se aiotaan suorittaa, ja tässä tapauksessa näyttää, että lähdön nimi on väärä.

Tämä toimii kiitos! Mutta ihmettelen, miksi minulla on ollut samanlainen silmukka toiminut hyvin, kun lähtöni on "$ f.SnpSift.vcf"? Ymmärtääkö se `. ': N eri tavalla kuin` `_' ': n jälkeen $ f: n?
Kyllä, se on oikein ja helppo testata käyttämällä nuken muuttujaa ja `kaikua '
Vaihtoehtoisesti voit käyttää `kaiun 'sijasta (tai sen lisäksi)` set -u`, joka antaa virheen määrittelemättömille muuttujille (tämä olettaa, että käytät kuorena Bashia tai Zsh: tä (et ole varma muista).
terdon
2018-12-03 22:12:52 UTC
view on stackexchange narkive permalink

for -silmukan käyttö tähän on ylivoimaisesti turvallisempi vaihtoehto. Sinun täytyy kuitenkin lainata muuttujiasi ja varmistaa, että välität oikean muuttujan nimen. Kun olet siinä, voit myös poistaa laajennuksen, jotta suodatetun tiedoston nimi voi olla foo_out.vcf eikä foo.vcf_out.vcf (mikä on Luo kaikki nämä yhteen:

  for f in * .vcf; do echo "filtering  $ f"; bcftools filter -i 'QUAL > 1000 '-o -suodatin / "$  {f //. Vcf}" _ out.vcf "$ f"; donefi  
Pidän tiedostosta "$ {f //. Vcf}", kiitos - tiedostonimeni ovat kasvaneet tarpeettoman kauan!
user172818
2018-12-02 08:56:35 UTC
view on stackexchange narkive permalink

Yhden linjan käyttäjille xargs on usein kätevämpi kuin for -silmukka:

  ls * .vcf | sed s, .vcf $ ,, \ | xargs -i echo 'bcftools filter -i "QUAL > 1000" -o "filter / {} _ out.vcf" "{} .vcf"' \ | rinnakkainen  

Huomaa, että komentorivisi (@ WouterDeCosterin korjauksella) kirjoittaa tuloksen kohtaan foo.vcf_out.vcf . Komentorivini kirjoittaa osoitteeseen foo_out.vcf .

Xargs on todellakin kätevä, mutta `ls: n jäsentäminen on hyvin hauras ja rikkoo minkä tahansa epätyypillisen tiedostonimen. Miksi ei `varten f * vcf: ssä; tee printf 'bcftools filter -i "QUAL> 1000" -o filter / "% s" "% s" \ n' "$ {f //. vcf} _out.vcf" "$ f"; tehty | rinnakkainen? Se näyttää yhtä yksinkertaiselta kuin `xargs`, mutta se voi käsitellä mielivaltaisia ​​tiedostojen nimiä.
@terdon En näe, että se on ongelma. Voit yksinkertaisesti lisätä lainausmerkkejä.
Kyllä, se suojaa välilyönneiltä, ​​mutta ei uusilta viivoilta. Ja OK, uudet rivit tiedostojen nimissä eivät ole jotain, joka tapahtuu hyvin usein, mutta se on mahdollista. Myönnän kuitenkin vapaasti, että voin vain nokkia, koska olen liian tottunut viettämään aikaa [unix.se] -palvelussa, jossa tällaista asiaa pidetään erittäin tärkeänä ja mikä tahansa esimerkki `` ls: n '' jäsentämisestä kohtaa kauhua. Silti, koska kuoren silmukka on turvallinen ja kivuton, näyttää siltä, ​​että on parempi käyttää sitä sen sijaan.


Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 4.0-lisenssistä, jolla sitä jaetaan.
Loading...