Estrazione della stessa colonna da ogni file in un file

Aug 21 2020

Ho il seguente set di dati con 171 file.

CHR:POS   REF:ALT   BREED

6:85406127 T:A 0.333333
6:85406128 T:C 0
6:85406129 C:G 0.333333
6:85406130 T:G 0.833333

L'output desiderato è

CHR:POS   REF:ALT   BREED BREED2 BREED3 ... 171st file

6:85406127 T:A 0.333333 0.33 0.5 .... 0.4
6:85406128 T:C NA 0.33 0.5 .... 0.4
6:85406129 C:G 0.333333 0.33 NA .... 0
6:85406130 T:G 0.833333 0.33 0.5 .... NA

I nomi dei file contengono i nomi delle razze. La prima e la seconda colonna contengono le stesse informazioni in ogni file. Come estrarrò solo la terza colonna da ogni file mantenendo tutte le colonne dal primo file?

Ho spostato il primo file in un'altra cartella per escluderlo dall'estrazione. Il seguente comando non ha dato il risultato.

cut -d " " -f3 *.txt | paste ../breedname.txt - > output.txt

Ho anche provato a utilizzare il comando awk mostrato in queste domande, ma non ha funzionato per il mio set di dati.

  • incolla la stessa colonna da più file in uno
  • Stampa ogni ennesima colonna di un file

Qualsiasi aiuto è ben accetto!

Risposte

kvantour Aug 21 2020 at 21:13

Ecco un modo molto veloce e sporco per farlo:

Supponendo che i tuoi file siano nello stesso ordine:

$ awk '(FNR==NR){a[FNR]=$0;next}
       {a[FNR]=a[FNR] FS $NF}
       END{for(i=1;i<=FNR;++i) print a[i]}' file1 file2 file3 ... filen

se vuoi che l'intestazione sia un po 'più pulita:

$ awk '(FNR==NR){a[FNR]=$0 (FNR==1?++c:"");next} {a[FNR]=a[FNR] FS $NF (FNR==1?++c:"")}
       END{for(i=1;i<=FNR;++i) print a[i]}' file1 file2 file3 ... filen

Supponendo che i tuoi file non siano nello stesso ordine:

$ awk '{key=$1 FS $2} (FNR==NR){a[key]=$0 (FNR==1?++c:"");next}
       {a[key]=a[key] FS $NF (FNR==1?++c:"")}
       END{for(i in a) print a[i]}' file1 file2 file3 ... filen
kupsef Aug 21 2020 at 21:40

Vorrei fare qualcosa di simile:

paste -d " " *.txt | awk '{printf "%s %s ",$1,$2; for (i = 3; i <= NF; i+=3){printf "%s ",$i} print ""}'

pasteunisce le linee verticalmente, in modo da avere ogni colonna una accanto all'altra. Dopodiché, devi solo selezionare le colonne richieste.