使用 Awk 将逗号分隔转换为制表符分隔

问题描述 投票:0回答:5

输入是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
5个回答
1
投票

由于所有字段都用双引号括起来,并且假设没有嵌入/转义双引号,我们可以使用双引号作为输入字段分隔符,这意味着我们只需要关注偶数字段。

一个

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

1
投票

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"

0
投票

您可以使用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

0
投票

使用任何 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

另请参阅使用 awk 高效解析 CSV 的最可靠方法是什么?.


0
投票

你也可以用 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

如你所见,我用大写字母打印了标题。

© www.soinside.com 2019 - 2024. All rights reserved.