Entfernen Sie eine ganze Spalte in Datei A, die die Namen der Felder in Datei B enthält

Entfernen Sie eine ganze Spalte in Datei A, die die Namen der Felder in Datei B enthält

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 cutBefehl cut -d' ' -f [...] fileAverwendet einfach Leerzeichen als Trennzeichen -d' 'und wählt aus, welche Felder -fausgelassen 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 fileAwählt nur die Kopfzeile aus, tr -s ' ' '\n'ändert alle Leerzeichen in Zeilenumbrüche (und -sfasst mehrere Vorkommen zu einzelnen zusammen) und cat -nfü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 fileBführen wir einen inversen grepPing mit den Headern der Löschliste aus (verwenden Sie , -wum sicherzustellen, dass eg id1nicht auch löscht id11), dann cut -f 1diese 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 cutist 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.

verwandte Informationen