2016-11-05 4 views
1

Ich möchte Dateinamen von Today.txt mit Main.txt vergleichen. Wenn es Übereinstimmung gibt, dann drucken Sie alle 6 Spalten der übereinstimmenden Datei von Main.txt mit einer neuen Datei say matched.txt.Wie vergleicht man Dateien mit verschiedenen Spalten in Unix?

und die Dateien, die mit Main.txt nicht übereinstimmen, führen Sie dann die Dateinamen und Zeit von TODAY.txt in einer neuen Datei sagen unmatched.txt

Main.txt

date  filename   timestamp space count status 
Nov 4 +CHCK01_20161104.txt 06:39 2.15M 17153 on_time 
Nov 4 TRIPS11_20161104.txt 09:03 0.00M 24  On_Time 
Nov 4 AR02_20161104.txt 09:31 0.00M 7  On_Time 
Nov 4 AR01_20161104.txt 09:31 0.04M 433  On_Time 

Heute. txt

filename  time 
CHCK01_20161104.txt 06:03 
CHCK05_20161104.txt 11:10 
CHCK09_20161104.txt 21:46 
AR01_20161104.txt 09:36 
AR02_20161104.txt 09:36 
ifs01_20161104.txt 21:16 
TRIPS11_20161104.txt 09:16 

Erforderliche Leistung: matched.txt

Nov 4 +CHCK01_20161104.txt 06:39 2.15M 17153 on_time 
Nov 4 TRIPS11_20161104.txt 09:03 0.00M 24  On_Time 
Nov 4 AR02_20161104.txt 09:31 0.00M 7  On_Time 
Nov 4 AR01_20161104.txt 09:31 0.04M 433  On_Time 

unmatched.txt

CHCK05_20161104.txt 11:10 
CHCK09_20161104.txt 21:46 
ifs01_20161104.txt 21:16 

Könnten Sie mir bitte auf diesem bitte helfen?

Vielen Dank im Voraus!

Antwort

0

awk zur Rettung!

$ awk 'FNR==1{next} 
     NR==FNR{a[$1]=$2; next} 
     $3 in a{print; delete a[$3]} 
      END{for(k in a) print k,a[k] > "unmatched"}' today main > matched 

$ head *matched 

==> matched <== 
Nov 4 CHCK01_20161104.txt 06:39 2.15M 17153 on_time 
Nov 4 TRIPS11_20161104.txt 09:03 0.00M 24  On_Time 
Nov 4 AR02_20161104.txt 09:31 0.00M 7  On_Time 
Nov 4 AR01_20161104.txt 09:31 0.04M 433  On_Time 

==> unmatched <== 
ifs01_20161104.txt 21:16 
CHCK09_20161104.txt 21:46 
CHCK05_20161104.txt 11:10 
+0

Für begrenzt Registerkarte Ausgabe, die Sie festlegen können '-v OFS = '\ t'' – karakfa

+0

Ich habe eine Frage an dich. Ich drucke die Dateien, die sich im Inprogress-Verzeichnis befinden, mit einem Pluszeichen (+) wie im Beispiel. Nov 4 + CHCK01_20161104.txt 06:39 2.15M 17153 on_time Die Dateien, die in progress sind, werden sie mit Plus (+) Symbol und andere Dateien werden in main.txt im gleichen Namen sein. Ich möchte die Dateien mit + Symbol und andere Dateien in meiner erforderlichen Ausgabe (abgestimmt), Bitte schlagen Sie vor, wie ich main.txt und Today.txt vergleichen, um übereinstimmende und unmatched.txt zu erhalten? Danke vielmals ! – Barcode

0

Mit awk, jeweils eine für matched und unmatched

$ awk 'NR==FNR{a[$1]; next} $3 in a{print > "matched.txt"}' Today.txt Main.txt 
$ cat matched.txt 
Nov 4 CHCK01_20161104.txt 06:39 2.15M 17153 on_time 
Nov 4 TRIPS11_20161104.txt 09:03 0.00M 24  On_Time 
Nov 4 AR02_20161104.txt 09:31 0.00M 7  On_Time 
Nov 4 AR01_20161104.txt 09:31 0.04M 433  On_Time 

$ awk 'NR==FNR{a[$3]; next} !($1 in a) && FNR>1{print > "unmatched.txt"}' Main.txt Today.txt 
$ cat unmatched.txt 
CHCK05_20161104.txt 11:10 
CHCK09_20161104.txt 21:46 
ifs01_20161104.txt 21:16 
  • Logic ist ähnlich, initialisieren Array a mit erforderlichen Spalte der ersten Datei Argument awk
  • dann basierend auf, ob Dateinamen aus der zweiten Datei sollte vorhanden sein oder nicht in a, auf die erforderliche Ausgabedatei drucken


Mit grep und awk Kombination:

$ grep -Ff <(awk 'NR>1{print $1}' Today.txt) Main.txt 
Nov 4 CHCK01_20161104.txt 06:39 2.15M 17153 on_time 
Nov 4 TRIPS11_20161104.txt 09:03 0.00M 24  On_Time 
Nov 4 AR02_20161104.txt 09:31 0.00M 7  On_Time 
Nov 4 AR01_20161104.txt 09:31 0.04M 433  On_Time 

$ grep -vFf <(awk 'NR>1{print $3}' Main.txt) Today.txt | tail -n+2 
CHCK05_20161104.txt 11:10 
CHCK09_20161104.txt 21:46 
ifs01_20161104.txt 21:16 
0

Hier ist die Antwort mit der Rohrleitung.

tail -n +2 /tmp/today | while read a b; do \ 
    if ! grep $a /tmp/main >> /tmp/matched; then \ 
     echo $a $b; \ 
    fi; \ 
done > /tmp/unmatched 

Erklärung

Print/tmp/heute mit Ausnahme der ersten Zeile

tail -n +2 /tmp/today 

die Datei in zwei Variablen lesen

while read a b 

grep die a $ in/tmp/Haupt und speichern Sie in einer Datei

grep $a /tmp/main >> /tmp/matched 

Wenn der grep nicht-Null ist, dann echo $ a und $ b

echo $a $b 

Ausgabe zurückgegeben:

[email protected]:~# cat /tmp/matched 
Nov 4 CHCK01_20161104.txt 06:39 2.15M 17153 on_time 
Nov 4 AR01_20161104.txt 09:31 0.04M 433  On_Time 
Nov 4 AR02_20161104.txt 09:31 0.00M 7  On_Time 
Nov 4 TRIPS11_20161104.txt 09:03 0.00M 24  On_Time 
[email protected]:~# cat /tmp/unmatched 
CHCK05_20161104.txt 11:10 
CHCK09_20161104.txt 21:46 
ifs01_20161104.txt 21:16 
[email protected]:~# 
Verwandte Themen