输入是CSV文件; 输出以制表符分隔。 使用以下命令 -
awk 'BEGIN{FS = "," ; -v OFS =“”; } {$1 = $1}1 ' 输入 > 输出
输入如下数据 - 1/1/1900 15:45 - CSV 文件
输出 - 1/1/1900 03:45 PM - 制表符分隔符文件
当我将 csv 文件转换为制表符分隔符时,上面的列将格式从 24H 格式更改为 12H 格式。我怎样才能保留与源相同的格式?请帮忙
由于所有字段都用双引号括起来,并且假设没有嵌入/转义双引号,我们可以使用双引号作为输入字段分隔符,这意味着我们只需要关注偶数字段。
一个
awk
想法:
awk '
BEGIN { FS="\""; OFS="\t" }
{ for (i=2;i<=NF;i+=2)
printf "%s%s", $i, (i==NF-1 ? ORS : OFS)
}
' input
# or as a one-liner:
awk 'BEGIN { FS="\""; OFS="\t" } { for (i=2;i<=NF;i+=2) printf "%s%s", $i, (i==NF-1 ? ORS : OFS) }' input
这会生成:
field1 field2 field3
abc xyz,abc MNC
在
FPAT
中使用 gnu-awk
你可以这样做:
awk -v OFS='\t' -v FPAT='"[^"]*"|[^,"]+' '{$1=$1} 1' input
field1 field 2 field3
abc "xyz,abc" MNC
FPAT='"[^"]*"|[^,"]+'
将字段模式设置为引用值 "..."
之一或任何不包含 "
和 ,
的值。
要引用输出中的每个字段,请使用:
awk -v OFS='\t' -v FPAT='"[^"]*"|[^,"]+' '
{
for (i=1; i<=NF; ++i)
gsub(/^"?|"?$/, "\"", $i)
} 1' file
"field1" "field2" "field3"
"abc" "xyz,abc" "MNC"
您可以使用mlr
mlr --c2t cat file
或者红宝石:
ruby -r csv -e 'puts CSV.parse($<.read).map{|row| row.join("\t")}' file
任一打印:
field1 field 2 field3
abc xyz,abc MNC
使用任何 awk:
$ awk -F'"' -v OFS= '{for (i=2; i<=NF; i+=2) gsub(/,/,RS,$i); gsub(/,/,"\t"); gsub(RS,",")} 1' file
field1 field 2 field3
abc xyz,abc MNC
你也可以用 Perl 来解决这个问题,如下所示:
perl -pe 's/,(?=(?:[^"]*"[^"]*")*[^"]*$)/\t/g; s/"//g; $_ = uc($_) if $. == 1' input.txt | column -t
输入
"field1","field2","field3","header"
"abc","xyz,abc","MNC","freeman"
输出
FIELD1 FIELD2 FIELD3 HEADER
abc xyz,abc MNC freeman
如你所见,我用大写字母打印了标题。