Unix-CSV 格式

Unix-CSV 格式

我正在嘗試將以下格式從 A 轉換為 B,其中您可以看到前兩列以最終格式互換,其數據完好無損並在它們之間通過管道傳輸,棘手的部分是最後一個日期格式從2016- 09-06 08:49:00 至「09/06/2016 上午 08:49:00」。我正在使用 bash shell,需要一個腳本來執行相同的操作。

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

乙:

"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"

答案1

我認為嘗試純粹在 bash 中完成它會相當棘手。

有一個程序csvfix應該可以為您完成大部分工作:http://neilb.bitbucket.org/csvfix/

答案2

以下答案基於

#!/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

data.csv是輸入檔(A在您的範例中)。執行上述腳本(名為csv2pipe.sh): bash csv2pipe.sh。輸出如下圖所示。

"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"

答案3

perl

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"

相關內容