
Ich versuche, das folgende Format von A nach B zu konvertieren. Sie sehen, dass die ersten beiden Spalten im endgültigen Format vertauscht sind, wobei ihre Daten intakt bleiben und zwischen ihnen weitergeleitet werden. Der schwierigste Teil ist der letzte, bei dem das Datumsformat von 2016-09-06 08:49:00 in „09/06/2016 08:49:00 AM“ geändert wird. Ich verwende die Bash-Shell und brauche ein Skript, um dasselbe zu tun.
A:
Display Name,SAM Account Name,Distinguished Name,Last Logon Time Stamp
Yolanda Perez,yperez1,"CN=Yolanda Perez,OU=Users,OU=PR - Miami SPCG,OU=PR - Puerto Rico,OU=Puerto Rico,OU=Caribbean - Unified,DC=intl,DC=bns",2016-09-06 08:49:00
B:
"SAM Account Name"|"Display Name"|"Distinguished Name"|"Last Logon Time Stamp"
"yperez1"|"Yolanda Perez,CN=Yolanda Perez"|"OU=Users,OU=PR - Miami SPCG,OU=PR - Puerto Rico,OU=Puerto Rico,OU=Caribbean - Unified,DC=intl,DC=bns"|"09/06/2016 08:49:00 AM"
Antwort1
Ich denke, dass der Versuch, es rein in Bash zu machen, ziemlich schwierig wäre.
Es gibt ein Programm csvfix
, das den Großteil der Arbeit für Sie erledigen sollte:http://neilb.bitbucket.org/csvfix/
Antwort2
Die folgende Antwort basiert aufDasUndDas.
#!/bin/bash
awk -vFPAT='([^,]*)|("[^"]+")' -vOFS=, '{
if (NR == 1) {
print "\""$2"\"" "|" "\""$1"\"" "|" "\"" $3 "\"" "|" "\""$4"\""
} else {
cmd ="date \"+%m/%d/%Y %H:%M:%S %p\" -d \""$4"\""
cmd | getline var
close(cmd)
print "\""$2"\"" "|" "\""$1"\"" "|"$3"|" "\""var"\""
}
}' data.csv
Hier data.csv
ist die Eingabedatei ( A
in Ihrem Beispiel). Führen Sie das obige Skript (mit dem Namen csv2pipe.sh
) wie folgt aus:
bash csv2pipe.sh
. Die Ausgabe wird unten angezeigt.
"SAM Account Name"|"Display Name"|"Distinguished Name"|"Last Logon Time Stamp"
"yperez1"|"Yolanda Perez"|"CN=Yolanda Perez,OU=Users,OU=PR - Miami SPCG,OU=PR - Puerto Rico,OU=Puerto Rico,OU=Caribbean - Unified,DC=intl,DC=bns"|"09/06/2016 08:49:00 AM"
Antwort3
Mitperl
perl -MTime::Piece -F, -alne '
print $.==1? "\"".join("\"|\"", $F[1], $F[0], @F[2..$#F])."\""
: join("|", "\"".$F[1]."\"", "\"".join(",", $F[0], substr($F[2],1))."\"", "\"".join(",", @F[3..9]), Time::Piece->strptime($F[10], "%Y-%m-%d %H:%M:%S")->strftime("\"%m/%d/%Y %H:%M:%S %p\""))
' file.csv
"SAM Account Name"|"Display Name"|"Distinguished Name"|"Last Logon Time Stamp"
"yperez1"|"Yolanda Perez,CN=Yolanda Perez"|"OU=Users,OU=PR - Miami SPCG,OU=PR - Puerto Rico,OU=Puerto Rico,OU=Caribbean - Unified,DC=intl,DC=bns"|"09/06/2016 08:49:00 AM"