2016-08-16 12 views
-2

ich einen riesigen file1 haben, die Werte hat wie folgt:Ersetzen eines bestimmten Feld mit awk, sed oder jede andere POSIX-Tool

a 1 
b 2 
c 3 
d 4 
e 5 

ich einen weiteren großen file2 haben, die Doppelpunkt mit sieben Feldern begrenzt ist wie folgt:

a:2543:2524:2542:252:536365:54654 
c:5454:5454:654:54:87:54 
d:87:65:1:98:32:87 

ich mag die Linien für die Variablen von file1 suchen und seinen Wert in der 7. Spalte in file2 zu ersetzen, so dass die Ausgabe sollte wie folgt lauten:

a:2543:2524:2542:252:536365:1 
c:5454:5454:654:54:87:3 
d:87:65:1:98:32:4 
+1

Welchen Code/welches Skript haben Sie ausprobiert? Ist wirklich die 'Datei1' so einfach wie es scheint? Sie erwarten nicht, dass wir den Code für Sie schreiben, oder? – Jdamian

+0

Ersetzen durch was? Ist 'file1' ein Mapping von' a' auf '1' usw., und wenn ja, warum wird' 54654' durch '1' ersetzt? –

+0

Ah, ich sehe - nach der ersten Spalte von 'Datei2'? –

Antwort

0

So kam ich mit einer Lösung auf; endete mit ein paar Zeilen Code. Vielleicht gibt es einen besseren Weg, es zu tun. Aber das funktioniert!

while read line ; do 
    var1=`echo $line| awk '{print $1}'` 
    var2=`echo $line| awk '{print $2}'` 
    awk -v var1="$var1" -v var2="$var2" -F ':' 'BEGIN { OFS = ":"} $1==var1 {sub(".*",var2,$7)}{print}' file2 > file2.tmp 
    mv file2.tmp file2 
done < file1 
cat file2 
+0

Viel effizienter 'read line' mit 'read -r var1 var2 _' zu ersetzen. (Natürlich wäre es besser als * dass * nur eine "awk" die ganze Arbeit erledigt, anstatt nur einen Aufruf pro Zeile, aber das ist ein separates Problem). –

0

Vielleicht wird dies awk arbeiten, werden die Dateien unter der Annahme sind als

geschrieben
awk -F: 'NR==FNR{a[$1]=$0;next;}a[$1]{$0=a[$1]}1' file1 file2 
a:2543:2524:2542:252:536365:1 
c:5454:5454:654:54:87:3 
d:87:65:1:98:32:4 
+0

Leider hat das für mich nicht funktioniert, aber ich habe eine Lösung gefunden, die ich unten gepostet habe. –

0

Dies sollte funktionieren - nimmt beide Dateien in der ersten Spalte sortiert werden - ich für sehr große Dateien mit Ihrer Lösung in irgendwelchen Leistungsvergleiche wäre sehr interessiert - sowohl Geschwindigkeit und Speicher - Linux --complement ist - Spezifisch aber leicht ersetzt, wenn nicht verfügbar

file0=$1 #file with single value 
file1=$2 #file with 6th value to be replaced 
# normalize on colon delimiter 
tr ' ' : <$file0| 
# join on first field 
join -t: $file1 -| 
# delete column 7 
cut --complement -d: -f7 
+0

Ich würde in Erwägung ziehen, Ihre Erweiterungen zu zitieren - und Sie könnten in Erwägung ziehen, '<(sort" $ file1 ")' und '<<(sort" $ file0 ")' zu verwenden, um die Sortierbeschränkung zu garantieren. –

Verwandte Themen