Linux将CSV文件中的一列拆分为两列

3

您好,我有一个包含以下内容的CSV文件:

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

请给我建议一个 Linux 命令或脚本,可以将此列拆分为三个列,并在同一文件中显示如下。
11  aa  ww
22  bb  kk
13  cc  ll

你尝试过什么?(http://mattgemmell.com/2008/12/08/what-have-you-tried/) - Some programmer dude
1
我刚试图修复您的格式,请检查现在发布的内容是否与您的真实文件完全相同,包括那些只有两个逗号的行。 - Ed Morton
5个回答

2
你可以使用 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命令来替换所有空格出现的地方为逗号。 向你致敬,朋友。 - Ujjawal Khare
最终 - Ujjawal Khare
好的,我可以将它改为逗号。稍等一下。不需要使用 sed - user000001
@user2043380已修复,现在可以不使用sed运行。 - user000001

1

这是一个非常棒的疯狂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 提醒我错误,使我重新审视我的解决方案。

1
太酷了!我不知道有粘贴命令。 - Ben
你的输出与原帖不符。 - user000001
哦哦,这是一个微妙的问题,也许我可以让提问者改变他的问题 :( - 我得再想想! - sotapme
嘿伙计, 非常感谢,它运行良好,唯一的区别是它将预期列更改为行,但我们肯定有一个解决方案。非常感谢你,伙计。 - Ujjawal Khare

0
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 (sort keys %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 - Ujjawal Khare

0

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

0

这个可能适合你:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接