
Ich habe eine Datei mit 500 Spalten. Ich muss einige Spalten entfernen, deren Namen in einer Liste in einer anderen Datei beschrieben sind. Zum Beispiel
fileA
:
id1 id22 id43 id4 id5 id6 id7 id68 id9 id10 id11
TT AA AG TC TT AA AG TC DD AA CC
TT AC GG TC TT AG AG TC AD AA DC
fileB
:
id1
id5
id10
id68
Gewünschte Ausgabe:
id22 id43 id4 id6 id7 id9 id11
AA AG TC AA AG DD CC
AC GG TC AG AG AD DC
Antwort1
Ich weiß nicht, ob Sie das so nennen wollen, aber Sie könnten es im Handumdrehen mit ganz einfachen Werkzeugen erledigen:
cut -d' ' -f $(head -n 1 fileA | tr -s ' ' '\n' | cat -n | grep -wvf fileB | cut -f 1 | tr '\n ' ',' | sed -e 's/,$//' -e 's/^,//') fileA
Erläuterung:
Der cut
Befehl cut -d' ' -f [...] fileA
verwendet einfach Leerzeichen als Trennzeichen -d' '
und wählt aus, welche Felder -f
ausgelassen werden sollen. Anschließend stellt sich die Frage, welche Felder/Spalten verwendet werden sollen. Diese werden durch eine kommagetrennte Indexliste vorgegeben, die wir spontan erstellen:
head -n 1 fileA
wählt nur die Kopfzeile aus, tr -s ' ' '\n'
ändert alle Leerzeichen in Zeilenumbrüche (und -s
fasst mehrere Vorkommen zu einzelnen zusammen) und cat -n
fügt dieser Liste Zeilennummern hinzu.
Diese Zeilennummern sind identisch mit den ursprünglichen Spaltennummern, daher müssen wir die verbleibenden auswählen. Mit grep -wvf fileB
führen wir einen inversen grep
Ping mit den Headern der Löschliste aus (verwenden Sie , -w
um sicherzustellen, dass eg id1
nicht auch löscht id11
), dann cut -f 1
diese Liste nur auf die Zeilennummern und übersetzen Zeilenumbrüche in Kommas ( tr '\n' ','
), wodurch wir unsere durch Kommas getrennte Liste der verbleibenden Spalten erhalten. Im letzten Schritt stehen jedoch noch Kommas vor und nach der Liste, daher müssen wir diese mit löschen sed -e 's/,$//' -e 's/^,//'
. Damit cut
ist die äußere Feldliste vollständig.
Führen Sie zur Gegenprüfung möglicherweise zunächst die inneren Pipes separat aus – der überschüssige Spaltenindex beeinflusst das Ergebnis nicht.