我正在尝试将下面的格式从 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"