2016-07-20 5 views
1

Ich versuche, bestimmte Werte aus der Zeichenfolge zu schneiden. Es funktioniert wie erwartet für die erste Spalte, aber wenn ich für die zweite Spalte versuche, gibt es nicht die gewünschte Ausgabe.Schnitt Befehlsproblem mit der 2. Spalte

-Code und Ausgabe

[psatav]$ echo '$$JOB_ESTD_TIME1'="'2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00'" | cut -d'|' -f1 
$$JOB_ESTD_TIME1='2016-04-16 00:00:00' 
[psatav]$ echo '$$JOB_ESTD_TIME2'="'2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00'" | cut -d'|' -f2 
'2016-04-16 20:00:00' 

Zweiter Befehl sollte zurückgeben: -

$$JOB_ESTD_TIME2='2016-04-16 20:00:00' 
+1

NOPES tun sollte, sollte es nicht – dnit13

+0

@ dnit13: - Was ich vermisse? wie funktioniert es gut für die erste Spalte und nicht für die zweite. Ich habe die gewünschte Ausgabe erwähnt. Welche Änderungen muss ich dann im Befehl vornehmen? –

+0

@PravinSatav: Das '-f1' und' -f2' funktionieren auf diese Weise, sobald der De-Limiter erreicht ist, wird der Wert genau davor und danach ausgegeben. so ist das Muster '$$ JOB_ESTD_TIME2 =' verloren, wenn '-f2' verwendet wird, weil nur' '2016-04-16 20: 00: 00'' ein Teil davon ist – Inian

Antwort

2

Was machst du $$JOB_ESTD_TIME1='2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00' diese ganze Zeichenfolge ist vorbei so für f1 schneiden schneidet es

$$JOB_ESTD_TIME1='2016-04-16 00:00:00' 

und f2 schneidet sie nur '2016-04-16 20:00:00'

Wenn Sie nicht wollen, awk und Stick verwenden, hier zu schneiden ist, was Sie

echo '$$JOB_ESTD_TIME2'=$(echo "'2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00'" | cut -d'|' -f2) 
$$JOB_ESTD_TIME2= '2016-04-16 20:00:00' 

echo '$$JOB_ESTD_TIME2'=$(echo "'2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00'" | cut -d'|' -f1) 
$$JOB_ESTD_TIME2='2016-04-16 00:00:00' 
+0

^Schöne Weise, es auch zu tun! – Inian

+0

Es funktioniert für mich. und bekam auch was war das Problem! –

1

Sie setzen Begrenzer für cut als | und damit -f1 schneidet alles vor der ersten | und druckt die erforderliche Leistung.

Aber -f2 wird die Daten zwischen ersten und zweiten | schneiden, was Sie bekommen.

Sie können unter awk Befehle verwenden Sie die gewünschte Ausgabe zu erhalten:

bash-4.1$ echo '$$JOB_ESTD_TIME1'="'2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00'" | awk -F"=" '{ 
split($2,a,"|"); print $1,"=",a[1]}' 
$$JOB_ESTD_TIME1 = '2016-04-16 00:00:00' 
bash-4.1$ echo '$$JOB_ESTD_TIME1'="'2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00'" | awk -F"=" '{ 
split($2,a,"|"); print $1,"=",a[2]}' 
$$JOB_ESTD_TIME1 = '2016-04-16 20:00:00' 
  • -F"=" Argument Sätze Trennzeichen = und daher wird $1 $$JOB_ESTD_TIME1 enthalten.
  • split Funktion splits $2 (der Rest von ist die Daten nach =) und speichert es in Array a.
  • print druckt die erforderlichen Felder aus Array.
3

Der cut Befehl in Ihrem OP wird auf diese Weise nicht funktioniert, Sie awk mit multiple delimiters wie auf diese Weise verwenden können: -

awk -F'[=|]' '{gsub(/ /, "", $2); printf "%s=%s\n", $1, $2}' 
awk -F'[=|]' '{gsub(/ /, "", $3); printf "%s=%s\n", $1, $3}' 

Für Ihren Fall

$ echo '$$JOB_ESTD_TIME1'="'2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00'" | awk -F'[=|]' '{ gsub(/ /, "", $2);printf "%s=%s\n", $1, $2 }' 
$$JOB_ESTD_TIME1='2016-04-16 00:00:00' 

$ echo '$$JOB_ESTD_TIME1'="'2016-04-16 00:00:00' | '2016-04-16 20:00:00'| '2016-04-17 08:00:00'" | awk -F'[=|]' '{ gsub(/ /, "", $3);printf "%s=%s\n", $1, $3 }' 
$$JOB_ESTD_TIME1='2016-04-16 20:00:00' 

White-Räume werden unter Verwendung von gsub auf jedem Feld entfernt, bevor es an printf übergeben wird.