2013-02-05 96 views
3

您好我有下面的条目CSV文件Linux的分割栏分成两个不同的列在同一个CSV文件

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

请建议我一个Linux命令或脚本,可以在此colomun分成在3列像下面一样的文件

11 aa ww 
22 bb kk 
13 cc ll 
+0

[你有什么试过吗?](http://mattgemmell.com/2008/12/08/what-have-you-tried/) –

+1

我只是试图修复你的格式,请检查现在发布的内容是什么样的完全像你的真实文件,包括那些只有2个逗号的行。 –

回答

2

您可以使用awk

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

BEGIN { 
    line = 0; #Initialize at zero 
} 
/,,/ { #every time we hit the delimiter 
    line = 0; #resed 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 
+0

亲爱的朋友, 工作得很好。 唯一的区别是,因为它是一个csv文件,您的命令行完全将它们分为不同的列,但是具有空间。我只需添加额外的sed命令,以逗号替换空间的所有空间。 HATS F给你的朋友。 –

+0

最后 AWK“BEGIN {线= 0;}/,,/{线= 0;}!/ ,,/{A [线++] =α[线路]”“$ 0;} END {对于(I a)中的打印一个[i]}'1.csv | sed's//,/ g'awk.csv> awk2.csv | sed -i's /,//'awk2.csv –

+0

好吧我可以改变它的逗号。一会儿。不需要'sed' – user000001

1

这里是一个不错的疯狂壳管道实际执行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

+0

你的输出OP的 – user000001

+0

Oooops一个细微之处user000001不匹配 - 也许我能得到OP改变他的问题:( - !我得重新考虑 – sotapme

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 
> 
+0

工作完全正常,但相同的逗号saperated问题,因为它是一个CSV文件。可固定sed命令。感谢一吨。 $猫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“如果(/,,/){$.= 0} $ A $ {} = $一个{$}。””。$ _如果($ != 0); END {的foreach(排序键%A){打印$ A {$ _}}}” t.csv 1,AL,11,AR,1 1,AR,1 1,AZ, 5 1,AZ,5 1,AZ,2 1,BA,1 1,BA,9 1,BA,1 –

0

这可能为你工作:

pr -tT3 -s\ file | sed \$d 
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 
相关问题