2016-07-25 10 views
1

Ich habe zwei große Dateien (~ 10GB) wie folgt:subtrahieren eine konstante Anzahl von einer Spalte

file1.csv

name,id,dob,year,age,score 
Mike,1,2014-01-01,2016,2,20 
Ellen,2, 2012-01-01,2016,4,35 
. 
. 

file2.csv

id,course_name,course_id 
1,math,101 
1,physics,102 
1,chemistry,103 
2,math,101 
2,physics,102 
2,chemistry,103 
. 
. 

Ich möchte 1 von den "id" Spalten dieser Dateien subtrahieren:

file1_updated.csv

name,id,dob,year,age,score 
Mike,0,2014-01-01,2016,2,20 
Ellen,0, 2012-01-01,2016,4,35 

file2_updated.csv

id,course_name,course_id 
0,math,101 
0,physics,102 
0,chemistry,103 
1,math,101 
1,physics,102 
1,chemistry,103 

Ich habe awk '{print ($1 - 1) "," $0}' file2.csv versucht, aber nicht bekommen, das richtige Ergebnis:

-1,id,course_name,course_id 
0,1,math,101 
0,1,physics,102 
0,1,chemistry,103 
1,2,math,101 
1,2,physics,102 
1,2,chemistry,103 

Antwort

3

Sie hinzugefügt haben eine zusätzliche Spalte in Ihrem Versuch. Stattdessen stellen Sie Ihr erstes Feld $1 zu $1-1:

awk -F"," 'BEGIN{OFS=","} {$1=$1-1;print $0}' file2.csv 

Das Semikolon der Befehle trennt. Wir setzen das Trennzeichen auf Komma (-F",") und das Ausgabefeld Seperator auf Komma BEGIN{OFS=","}. Der erste Befehl, der 1 vom ersten Feld subtrahiert, wird zuerst ausgeführt, dann wird der Druckbefehl als zweiter ausgeführt, sodass der gesamte Datensatz $0 jetzt den neuen Wert $1 enthält, wenn er gedruckt wird.

Es kann hilfreich sein, nur 1 von Datensätzen zu subtrahieren, die nicht Ihre Kopfzeile sind. So können Sie eine Bedingung auf den ersten Befehl hinzufügen:

awk -F"," 'BEGIN{OFS=","} NR>1{$1=$1-1} {print $0}' file2.csv 

Jetzt nur subtrahieren wir, wenn die Datensatznummer (NR) größer als 1. Dann haben wir einfach den gesamten Datensatz drucken.

+0

Danke, aber 'awk '{$ 1 = $ 1-1; print $ 0}' file2.csv 'gibt nur die erste von 1 subtrahierte Spalte aus. Ich brauche alle Spalten in der Ausgabe. – Malgi

+0

Mein schlechtes. Ich habe das Skript aktualisiert, um das Eingabefeldtrennzeichen in Komma sowie das Ausgabefeldtrennzeichen zu ändern – JNevill

+0

Dank @JNevill. Du hast meinen Tag gerettet ;) – Malgi

Verwandte Themen