2012-04-02 3 views
1

Dies ist für einige der Experten hier einfach sein muss - ich kann es nicht herausgefunden:die Kommentare (insert „“ als erstes Zeichen) in die zweite Datei

File1: 
0000001 test1 
;0000002 test2 
;0000003 test3 
0000005 test5 
;00000006 test6 

File2: 
000001 test1 
000002 test2 
000003 test3 
000004 test4 
000005 test5 
000006 test6 
000007 test7 

Die Ausgabe sollte :

000001 test1 
;000002 test2 
;000003 test3 
000004 test4 
000005 test5 
;000006 test6 
000007 test7 

Hinweise: - Beide Dateien sind sortiert;
- die Ausgabedatei sollte die gleiche Anzahl von Zeilen wie die Datei2 haben, mit dem ";" Zeichen aus der Datei1 kopiert.

Viel verpflichtet

+2

Eh? Sind Datei 1 und 2 beide Eingaben? Welche Bits der Ausgabe beziehen sich auf welche Dateien? Ich könnte es wahrscheinlich tun, aber ich kann nicht herausfinden, was "es" ist! – John3136

+0

Yup, beide File1 und File2 sind eingegeben. Ich möchte eine 3. Datei basierend auf den obigen Regeln erstellt haben: –

+0

Ihre Regeln sind unvollständig. Wenn die erste Zeile von Datei1 "; 000001 Banane" ist und die erste Zeile von Datei2 "000001 Apfel" ist, was ist die gewünschte erste Zeile der Ausgabe? –

Antwort

2

Dies funktioniert der Trick:

#!/bin/sh 
while read f2line 
do 
    # strip just the test id (chars after the space) 
    testId=`echo $f2line | awk '{print $2}'` 
    # If file1 has a line for the test starting with a ';' then prefix the line 
    # from file2 with a ';', else just print the line from file2 
    grep -q ";[1234567890]\+ $testId" file1 
    if [ $? = 0 ] ; then 
     echo ";$f2line" 
    else 
     echo $f2line 
    fi 
done < file2 
+0

Dies liest alle Datei1 für jede Zeile von Datei2. Das ist ziemlich teuer. –

+0

Hängt von der Dateigröße ab - wenn Sie nicht in Millionen von Zeilen kommen, wäre das kein Problem. – John3136

+0

@ John3136 Danke John, das funktioniert! –

2

Ungeprüfte:

awk ' 
    NR==FNR {if ($0 ~ /^;/) comment[substr($1,2)+0] = 1; next} 
    ($1+0) in comment {print ";" $0; next} 
    {print} 
' file1 file2 

"+0" Verwendung "0001" auf "1" zu konvertieren, da das erste Feld hat verschiedene Zahlen von Nullen in den zwei Dateien.

+0

Dies führt nicht zu den gewünschten Ergebnissen. – John3136

+0

@ John3136, richtig, danke. –

+0

@glennjackman Danke Glenn, großartige Lösung! –

1

Dies könnte für Sie arbeiten (GNU sed):

sed '/^;0*\(......\) .*/!d;s||/^\1/s/^/;/|' file1 | sed -f - file2 
000001 test1 
;000002 test2 
;000003 test3 
000004 test4 
000005 test5 
;000006 test6 
000007 test7 
+0

Danke !!! Es funktioniert super! –

+0

Spoke zu früh ... Es funktioniert gut für das Testbeispiel, wo beide Dateien sortiert sind. Meine realen Dateien sind nicht sortiert ... eh ... –

+0

It Es sollte keinen Unterschied machen, ob die Dateien sortiert sind oder nicht, da die Schlüssel nicht der Position in der Datei entsprechen, dh sed-Befehle werden für Datensätze mit den Schlüsseln mit den Endungen 2,3 und 6 im ersten Feld in Datei1 und Datei2 generiert. Oder fehlt mir etwas? – potong