【问题标题】:Linux split a column into two different columns in a same CSV file [closed]Linux在同一个CSV文件中将一列拆分为两个不同的列[关闭]
【发布时间】:2013-02-05 14:05:46
【问题描述】:

您好,我有一个包含以下条目的 csv 文件

11
22
13
,,
aa
bb
cc
,,
ww
kk
ll
,,

请向我推荐一个 linux 命令或脚本,它可以将这个 colomun 拆分为 3 列在同一个文件中,如下所示

11  aa  ww
22  bb  kk
13  cc  ll

【问题讨论】:

  • 我刚刚尝试修复您的格式,请检查现在发布的内容是否与您的真实文件完全一样,包括那些只有 2 个逗号的行。

标签: linux bash shell sed awk


【解决方案1】:

您可以使用awk 来完成。

创建一个名为script.awk的文件,内容如下:

BEGIN {
   line = 0; #Initialize at zero
}
/,,/ { #every time we hit the delimiter
   line = 0; #reset line to zero 
}
!/,,/{ #otherwise
   a[line] = a[line]" "$0; # Add the new input line to the output line
   line++; # increase the counter by one 
}
END {
   for (i in a )
      print a[i] # print the output
}

像这样运行文件:

awk -f test.awk < datafile 

输出:

$ cat datafile
11
22
13
,,
aa
bb
cc
,,
ww
kk
ll
,,
$ awk -f script.awk < datafile 
 11 aa ww
 22 bb kk
 13 cc ll

或者,如果您只想要单线,请执行以下操作:

awk 'BEGIN{line=0;}/,,/{line=0;}!/,,/{a[line++]=a[line]" "$0;}END{for (i in a ) print a[i]}' datafile 

编辑:

这将在字段之间添加逗号:

awk 'BEGIN{line=0;}/,,/{line=0;}!/,,/{a[line++]=a[line]?a[line]","$0:$0;}END{for (i in a ) print a[i]}' datafile
                                                              # ^ This is the part that I changed

【讨论】:

  • 亲爱的朋友,工作正常。唯一的区别是,因为它是一个 csv 文件,所以您的命令行将它们完美地划分为不同的列,但有空格。我只需要添加额外的 sed 命令来用逗号替换所有出现的空格。向你的朋友致敬。
  • 终于 awk 'BEGIN{line=0;}/,,/{line=0;}!/,,/{a[line++]=a[line]" "$0;}END{ for (i in a ) print a[i]}' 1.csv | sed 's/ /,/g' awk.csv > awk2.csv| sed -i 's/,//' awk2.csv
  • 好的,我可以把它改成逗号。一瞬间。无需sed
  • @user2043380 修复了它,因此它可以在没有 sed 的情况下工作。
【解决方案2】:

这是一个不错的疯狂的 shell 管道,实际上可以满足 OP 的要求:!

#% cat t
11
22
13
,,
aa
bb
cc
,,
ww
kk
ll
,,

然后

#% pr -t -3 -l 4 -s' ' t | sed '$d'
11 aa ww
22 bb kk
13 cc ll

我确信有更好的命令,而无需借助代码。

编辑感谢@user000001提醒我的错误,让我重新审视我的解决方案。

【讨论】:

  • 酷!我不知道粘贴命令。
  • 您的输出与 OP 的不匹配
  • 哎呀用户000001的一个微妙点-也许我可以让OP改变他的问题:(-我得再想一想了。!
  • 嘿,伙计,非常感谢,工作正常,唯一不同的是它将预期的列更改为行,但我们当然有一个固定装置。非常感谢朋友。
【解决方案3】:
perl -lne 'if(/,,/){$.=0}$a{$.}=$a{$.}." ".$_ if($.!=0);END{foreach (sort keys %a){print $a{$_}}}'

测试如下:

> cat temp
11
22
13
,,
aa
bb
cc
,,
ww
kk
ll
,,
> perl -lne 'if(/,,/){$.=0}$a{$.}=$a{$.}." ".$_ if($.!=0);END{foreach (sort keys %a){print $a{$_}}}' temp
 11 aa ww
 22 bb kk
 13 cc ll
> 

【讨论】:

  • 工作得很好,但同样的逗号分隔问题,因为它是一个 csv 文件。可以使用 sed 命令修复。万分感谢。 $ cat t.csv 1,AL,1 1,AZ,5 1,BA,1 ,, 1,AR,1 1,AZ,5 1,BA,9 ,, 1,AR,1 1,AZ,2 1 ,BA,1 $ perl -lne 'if(/,,/){$.=0}$a{$.}=$a{$.}." ".$_ if($.!=0); END{foreach (排序键 %a){print $a{$_}}}' t.csv 1,AL,1 1,AR,1 1,AR,1 1,AZ,5 1,AZ,5 1, AZ,2 1,BA,1 1,BA,9 1,BA,1
【解决方案4】:

这可能对你有用:

pr -tT3 -s\  file | sed \$d

【讨论】:

    【解决方案5】:

    使用 awk

    awk 'BEGIN {RS=",,\n"; FS="[\n]"}{ }{a=a$1" ";b=b$2" ";c=c$3" ";} END{print a"\n"b"\n"c}' temp.txt
    

    输出

    11 aa ww
    22 bb kk
    13 cc ll
    

    【讨论】:

      猜你喜欢
      • 2021-12-02
      • 1970-01-01
      • 2022-12-20
      • 2023-03-10
      • 2015-01-13
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多