Unix-CSV-Formatierung

Unix-CSV-Formatierung

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.csvist die Eingabedatei ( Ain 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"

verwandte Informationen