Wählen Sie eine bestimmte Spalte jeder Datei aus und fügen Sie sie in eine neue Datei ein

7

Ich habe 20 tabulatorgetrennte Dateien mit der gleichen Anzahl von Zeilen. Ich möchte jede vierte Spalte jeder Datei auswählen, die in eine neue Datei eingefügt wird . Am Ende hat die neue Datei 20 Spalten, wobei jede Spalte aus 20 verschiedenen Dateien stammt.

Wie kann ich das mit Unix / Linux-Befehlen machen?

Eingabe, 20 desselben Formats, ich möchte die 4. Spalte, die hier als A1 für Datei 1 bezeichnet wird:

chr1    1734966 1735009 A1       0       0       0       0       0       1       0       
chr1    2074087 2083457 A1       0       1       0       0       0       0       0  
chr1    2788495 2788535 A1       0       0       0       0       0       0       0 
chr1    2821745 2822495 A1       0       0       0       0       0       1       0  
chr1    2821939 2822679 A1       1       0       0       0       0       0       0 
...

Ausgabedatei mit 20 Spalten, jede Spalte stammt aus einer der 4. Spalten der 20 Dateien:

A1       A2       A3       ...       A20        
A1       A2       A3       ...       A20     
A1       A2       A3       ...       A20       
A1       A2       A3       ...       A20        
A1       A2       A3       ...       A20 
...
Jun Cheng
quelle
cut ist der Befehl, der colomun aus der Datei erhält. und Einfügen ist ein weiterer Befehl, der Farben horizontal einfügt. Scheck: Mann schneiden, Mann Paste
Vineeth Chowdhary
3
Bitte bearbeiten Sie Ihre Frage und geben Sie uns ein Beispiel für Ihre Eingabedateien und Ihre gewünschte Ausgabe. Wie sind Spalten definiert? Räume? Kommas? Tabs? Etwas anderes?
Terdon
Ich habe Ihre Frage geändert, um sie direkter zu gestalten, da andere (und vielleicht auch Sie) wissen möchten, wie Sie das tun, was Sie fragen, und nicht nur, wenn es Menschen gibt, die in der Lage sind, ein solches Problem zu lösen.
Anthon
Danke für die Kommentare. Ich habe meine Frage bearbeitet. Hoffnung ist klar zu wissen.
Jun Cheng
2
@ JunCheng paste <(cut -f 4 1.txt) <(cut -f 4 2.txt) .... <(cut -f 4 20.txt). Das funktioniert, weil cutstandardmäßig Kürzungen in durch TAB getrennten Feldern vorgenommen werden. Wenn die Frage erneut geöffnet wird, werde ich dies auch als Antwort veröffentlichen.
Anthon

Antworten:

4

mit pasteunder bash kannst du machen:

paste <(cut -f 4 1.txt) <(cut -f 4 2.txt) .... <(cut -f 4 20.txt)

Mit einem Python-Skript und einer beliebigen Anzahl von Dateien ( python scriptname.py column_nr file1 file2 ... filen):

#! /usr/bin/env python

# invoke with column nr to extract as first parameter followed by
# filenames. The files should all have the same number of rows

import sys

col = int(sys.argv[1])
res = {}

for file_name in sys.argv[2:]:
    for line_nr, line in enumerate(open(file_name)):
        res.setdefault(line_nr, []).append(line.strip().split('\t')[col-1])

for line_nr in sorted(res):
    print '\t'.join(res[line_nr])
Anthon
quelle
2

Das folgende Skript führt dies mit awk aus. Ich habe der Einfachheit halber eine Rownummer hinzugefügt, die die Anzahl der Zeilen in Ihren Dateien angibt (r). Die Anzahl der Spalten, die Sie einfügen möchten, wird durch c angegeben.

directory=/your-directory/
r=4
c=20

for n in $(seq 1 $r); do
echo "$n" >> rownumber.txt
done

for n in $(seq 1 $c); do
awk '{ print $4}' /$directory/file-$n.txt > /$directory/output-$n.txt
done

paste /$directory/rownumber.txt /$directory/output-[1-$c]*.txt > /$directory/newfile.txt
Ruthger Righart
quelle