2016-08-04 10 views
0

Ich brauche kleine Hilfe.Parse Zeilen aus zwei Spalten Dateien

Ich mag in bash analysiert aus folgenden zwei Dateien Zeilen (nur aus dem zweiten Datei), in der zweite Spalte sind identisch, aber theit erste Spalten sind einzigartig:

file1 
111403787651,111915870316631 
111408649892,111917070744403 
111408653841,111919750018614 
111408655467,111917420005028 

file2 
111403787651,111915870316631 
444444444441,111917070744403 
222222222222,333333333333333 

Ausgang: nur aus dem zweiten Datei

444444444441,111917070744403 

dank

+0

Könnten die Daten in Datei 1 Einträge in der Form '111,222' und' 112,222' haben (gleicher zweiter Spaltenwert, andere Spalte 1 Werte)? –

+0

"Zweite Spalten sind identisch" bedeutet was genau? "Wo wurde die zweite Spalte in der ersten Datei gefunden"? Bedeutet "erste Spalte eindeutig" auch "erste Spalte * nicht * in der ersten Datei gefunden"? –

+0

... haben die Paarungen zwischen der ersten und der zweiten Spalte in der ersten Datei überhaupt einen Effekt, oder könnte die Reihenfolge jeder Spalte vollständig randomisiert werden, ohne die Ausgabe zu ändern? –

Antwort

1

awk zur Rettung!

$ awk -F, 'NR==FNR{a[$2]=$1; next} $2 in a && $1 != a[$2]' file1 file2 
444444444441,111917070744403 
0

Unter der Annahme, dass ich richtig Ihre Absicht gelesen habe (eine große Annahme, wie die Sprache, in der Frage weitgehend ungenau ist), ist die folgend eine native-Bash-Implementierung keine externen Tools benötigen, und gibt den gewünschten Ausgang die Eingänge in der Frage gegeben:

#!/bin/bash 
#  ^^^^ - NOT /bin/sh, as this requires bash-only (indeed, bash-4.x+-only) features 

# read first file's contents 
declare -A first=() second=() # define associative arrays; requires bash 4.0 
while IFS=, read -r a b; do  # read columns into variables a and b 
    first[$a]=1; second[$b]=1  # set associative-array keys for each 
done <file1      # ...doing the above reading from file1 

# iterate through second file's contents 
while IFS=, read -r a b; do  # again, read into a and b 
    if [[ ${second[$b]} && ! ${first[$a]} ]]; then # if we already saw b, and did not see a 
    printf '%s,%s\n' "$a" "$b"     # ...then emit output. 
    fi 
done <file2      # ...doing the above reading from file2 

Referenzen:

  • BashFAQ #001 ("Wie kann ich eine Datei (Datenstrom, Variable) Zeile für Zeile (oder Feld für Feld) lesen?"
  • BashFAQ #006 ("Wie kann ich [...] assoziative Arrays verwenden?")
+1

Interessanter funktioneller Unterschied zwischen dieser und @ karakfa's awk Antwort ist, wo w, x und y, z in Datei1 und w, z in Datei2 erscheinen. Das awk-Skript gibt w, z aus, während das bash-Skript das awk-Skript nicht benötigt, damit das erste Feld dem zweiten Feldwert in file1 zugeordnet wird, während das bash-Skript nur das erste Feld für jeden zweiten Feldwert benötigt in Datei1. Schade, dass das OP diesen Fall nicht in ihre Beispiel-Eingabe/Ausgabe aufgenommen hat, damit wir wissen, was sie wollen. Ich bin immer wieder überrascht, wie wenig Gedanken in die Beispiele hinein gehen .... :-(. –

Verwandte Themen