2017-10-14 1 views
0

ich eine Datenbank gegeben habe, die in diesem Format strukturiert istSortierung Datenbank nach Datum Spalte/Shell

10027|Chen|Ning|female|1982-12-08|2010-02-22T17:59:59.221+0000|1.2.9.86|Firefox 
10995116908|Chen|Wei|female|1985-08-02|2010-05-2420:52:26.582+0000|27.98.244.108|Firefox 

(beachten Sie auf dem T in der 6. Spalte)

Meine Aufgabe zur Ausgabe der Zeilen der Datenbank mit Daten beginnend von einem gegebenen dateA zu einem anderen gegebenen dateB.

Bisher habe ich versucht, meine Datei nach der 6. Spalte mit der Sortierung -M und speziell sort -k 6M -t "|" "file.dat" oder sort -k6 -M -t "|" und anderen Studien zu sortieren.

Aber nichts passiert.

Ich brauche die Sortierung so dass ich den Anfang und Ende mit awk

EDIT Beispiel angeben Die gewünschte Sortier Ausgabe von diesem

933|Perera|Mahinda|male|1989-12-03|2010-03-17T13:32:10.447+0000|192.248.2.123|Firefox 
1129|Lepland|Carmen|female|1984-02-18|2010-02-28T04:39:58.781+0000|81.25.252.111|Internet Explorer 
4194|Do|Hα» ChΓ­|male|1988-10-14|2010-03-17T22:46:17.657+0000|103.10.89.118|Internet Explorer 
8333|Wang|Chen|female|1980-02-02|2010-03-15T10:21:43.365+0000|1.4.16.148|Internet Explorer 
8698|Liu|Chen|female|1982-05-29|2010-02-21T08:44:41.479+0000|14.103.81.196|Firefox 

müssen diese

8698|Liu|Chen|female|1982-05-29|2010-02-21T08:44:41.479+0000|14.103.81.196|Firefox 
1129|Lepland|Carmen|female|1984-02-18|2010-02-28T04:39:58.781+0000|81.25.252.111|Internet Explorer 
8333|Wang|Chen|female|1980-02-02|2010-03-15T10:21:43.365+0000|1.4.16.148|Internet Explorer 
933|Perera|Mahinda|male|1989-12-03|2010-03-17T13:32:10.447+0000|192.248.2.123|Firefox 
4194|Do|Hα» ChΓ­|male|1988-10-14|2010-03-17T22:46:17.657+0000|103.10.89.118|Internet Explorer 
+0

Bitte fügen Sie Ihre gewünschte Ausgabe für diese Beispieleingabe zu Ihrer Frage hinzu. – Cyrus

+0

show wie spezifiziert man * ein bestimmtes DatumA zu einem anderen gegebenen DatumB * – RomanPerekhrest

+0

@RomanPerekrest wahrscheinlich Datum A 2010-02-15T09: 33: 33.400 + 0000, da es auch nicht für uns angegeben wurde, bis Datum 2010-03-16T20 : 20: 20.300 + 0000 –

Antwort

1

Irgendwann sehe ich in dieser Aufgabe nichts besonderes - nur einfaches Sortieren:

sort -k6,6 -t "|" file.dat 

Der Ausgang:

8698|Liu|Chen|female|1982-05-29|2010-02-21T08:44:41.479+0000|14.103.81.196|Firefox 
1129|Lepland|Carmen|female|1984-02-18|2010-02-28T04:39:58.781+0000|81.25.252.111|Internet Explorer 
8333|Wang|Chen|female|1980-02-02|2010-03-15T10:21:43.365+0000|1.4.16.148|Internet Explorer 
933|Perera|Mahinda|male|1989-12-03|2010-03-17T13:32:10.447+0000|192.248.2.123|Firefox 
4194|Do|Hα» ChΓ­|male|1988-10-14|2010-03-17T22:46:17.657+0000|103.10.89.118|Internet Explorer 
+0

Danke, dass gearbeitet, obwohl ich dachte, dass -M Option wurde benötigt. –

+0

'-M' ist für Monat sort, nicht für die ganze datetime – RomanPerekhrest

0

Added ein paar zusätzlichen Datenleitungen Suchbeispiele ein bisschen leichter zu sehen, machen:

933|Perera|Mahinda|male|1989-12-03|2010-03-17T13:32:10.447+0000|192.248.2.123|Firefox 
1129|Lepland|Carmen|female|1984-02-18|2010-02-28T04:39:58.781+0000|81.25.252.111|Internet Explorer 
4194|Do|H? Ch?|male|1988-10-14|2010-03-17T22:46:17.657+0000|103.10.89.118|Internet Explorer 
8333|Wang|Chen|female|1980-02-02|2010-03-15T10:21:43.365+0000|1.4.16.148|Internet Explorer 
8698|Liu|Chen|female|1982-05-29|2010-02-21T08:44:41.479+0000|14.103.81.196|Firefox 
4567|Kim|Lisa|female|1982-05-29|2009-02-21T08:44:41.479+0000|14.103.81.196|Firefox 
1234|Axe|John|male|1982-05-29|2012-02-21T08:44:41.479+0000|14.103.81.196|Firefox 

Ich werde definiert eine bash Skript [search.sh] mit folgenden Eingangsparametern:

search.sh [--born_after <dateA>] [--born_before <dateB>] -f <dbfile> 

`--born_after <dateA>` : [optional] search for data records with field6 >= this search parameter; [format=YYYY-MM-DDTHH:MM:SS.sss+HHMM] [default=0000-00-00T00:00:00.000+0000] 
`--born_before <dateB>` : [optional] search for data records with field6 <= this search parameter; [format=YYYY-MM-DDTHH:MM:SS.sss+HHMM] [default=9999-99-99T99:99:99.999+9999] 
`-f <dbfile>`   : [required] data file to search 

Das eigentliche Skript:

$ cat search.sh 
#!/bin/bash 

# set default search dates, clear the dbfile variable: 

dateA="0000-00-00T00:00:00.000+0000" 
dateB="9999-99-99T99:99:99.999+9999" 

unset dbfile 

# simulate getopts so we can parse for long and short option names 

while [ $# -gt 0 ] 
do 
     case $1 in 
       --born-after) dateA=$2         ; shift ;; 
       --born-before) dateB=$2         ; shift ;; 
       -f)    dbfile=$2         ; shift ;; 
       *)    echo "Unexpected argument '$1'. Aborting." ; exit 1 ;; 
     esac 

     shift 
done 

# if we didn't get receive/parse a `-f <dbfile>` option then abort: 

[[ "${dbfile}" = '' ]] && echo "Missing a dbfile. Aborting." && exit 1 

# start by sorting dbfile using RomanPerekhrest's solution; then pipe results to 
# an awk script to handle the 'search' 

sort -k6,6 -t "|" ${dbfile} | awk -F"|" -v dateA="${dateA}" -v dateB="${dateB}" '$6>=dateA && $6<=dateB' 
  • -v date[AB]="${date[AB]}": unsere bash Variablen in das awk Skript übergeben; der Einfachheit halber werde halten wir die gleichen Namen
  • -F "|": awk Eingabefeld Separator für
  • $6>=dateA && $6<=dateB definieren: nur Zeilen drucken, wo FIELD6 zwischen (einschließlich) unsere Suche ist Daten

einige Beispielläufe der Skript:

# no search dates provided (ie, use defaults; display entire file (sorted)) 
$ search.sh -f file.dat 
4567|Kim|Lisa|female|1982-05-29|2009-02-21T08:44:41.479+0000|14.103.81.196|Firefox 
8698|Liu|Chen|female|1982-05-29|2010-02-21T08:44:41.479+0000|14.103.81.196|Firefox 
1129|Lepland|Carmen|female|1984-02-18|2010-02-28T04:39:58.781+0000|81.25.252.111|Internet Explorer 
8333|Wang|Chen|female|1980-02-02|2010-03-15T10:21:43.365+0000|1.4.16.148|Internet Explorer 
933|Perera|Mahinda|male|1989-12-03|2010-03-17T13:32:10.447+0000|192.248.2.123|Firefox 
4194|Do|H? Ch?|male|1988-10-14|2010-03-17T22:46:17.657+0000|103.10.89.118|Internet Explorer 
1234|Axe|John|male|1982-05-29|2012-02-21T08:44:41.479+0000|14.103.81.196|Firefox 

# only print records (sorted) with field6 >= 2009-10-01 
$ search.sh --born-after '2009-10-01T00:00:00.000+0000' -f file.dat 
8698|Liu|Chen|female|1982-05-29|2010-02-21T08:44:41.479+0000|14.103.81.196|Firefox 
1129|Lepland|Carmen|female|1984-02-18|2010-02-28T04:39:58.781+0000|81.25.252.111|Internet Explorer 
8333|Wang|Chen|female|1980-02-02|2010-03-15T10:21:43.365+0000|1.4.16.148|Internet Explorer 
933|Perera|Mahinda|male|1989-12-03|2010-03-17T13:32:10.447+0000|192.248.2.123|Firefox 
4194|Do|H? Ch?|male|1988-10-14|2010-03-17T22:46:17.657+0000|103.10.89.118|Internet Explorer 
1234|Axe|John|male|1982-05-29|2012-02-21T08:44:41.479+0000|14.103.81.196|Firefox 

# only print records (sorted) with field6 between 2009-10-01 and 2011-05-05 
$ search.sh --born-after '2009-10-01T00:00:00.000+0000' --born-before '2011-05-05T23:59:59.999+9999' -f file.dat 
8698|Liu|Chen|female|1982-05-29|2010-02-21T08:44:41.479+0000|14.103.81.196|Firefox 
1129|Lepland|Carmen|female|1984-02-18|2010-02-28T04:39:58.781+0000|81.25.252.111|Internet Explorer 
8333|Wang|Chen|female|1980-02-02|2010-03-15T10:21:43.365+0000|1.4.16.148|Internet Explorer 
933|Perera|Mahinda|male|1989-12-03|2010-03-17T13:32:10.447+0000|192.248.2.123|Firefox 
4194|Do|H? Ch?|male|1988-10-14|2010-03-17T22:46:17.657+0000|103.10.89.118|Internet Explorer 
+0

Sie sind ein Lebensretter, und obwohl es perfekt für kleine Datenbanken funktioniert, wenn ich mit großen Dateien hantiere, funktioniert es nicht so, wie es sollte. Sollte ich kompliziertere Dinge wie den Compiler oder die Shell-Instanz/Version überprüfen? –

+0

Sie müssten den Kommentar erweitern "es funktioniert nicht wie es sollte"; Wenn Sie normalerweise nach einer (relativ) kleinen Anzahl von Zeilen suchen, sollte es etwas effizienter sein, wenn Sie zuerst die 'awk'-Arbeit ausführen und dann die Ausgabe an' sort 'leiten (das Ergebnis ist, dass Sie würde weniger Ressourcen ausgeben, wenn Sie einen kleineren Datensatz sortieren) – markp

+0

etwas anderes, worüber Sie nachdenken sollten ... Wenn Sie diese Datei immer nach Feld6 sortieren, sollten Sie sie einmal sortieren und die Ergebnisse in einer neuen Datei speichern. Führen Sie dann Ihre Suchen aus die neue/sortierte Datei (dh den Overhead des wiederholten Sortierens der ursprünglichen Datei eliminieren) – markp