您好我有下面的条目CSV文件Linux的分割栏分成两个不同的列在同一个CSV文件
11
22
13
,,
aa
bb
cc
,,
ww
kk
ll
,,
请建议我一个Linux命令或脚本,可以在此colomun分成在3列像下面一样的文件
11 aa ww
22 bb kk
13 cc ll
您好我有下面的条目CSV文件Linux的分割栏分成两个不同的列在同一个CSV文件
11
22
13
,,
aa
bb
cc
,,
ww
kk
ll
,,
请建议我一个Linux命令或脚本,可以在此colomun分成在3列像下面一样的文件
11 aa ww
22 bb kk
13 cc ll
您可以使用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
亲爱的朋友, 工作得很好。 唯一的区别是,因为它是一个csv文件,您的命令行完全将它们分为不同的列,但是具有空间。我只需添加额外的sed命令,以逗号替换空间的所有空间。 HATS F给你的朋友。 –
最后 AWK“BEGIN {线= 0;}/,,/{线= 0;}!/ ,,/{A [线++] =α[线路]”“$ 0;} END {对于(I a)中的打印一个[i]}'1.csv | sed's//,/ g'awk.csv> awk2.csv | sed -i's /,//'awk2.csv –
好吧我可以改变它的逗号。一会儿。不需要'sed' – user000001
这里是一个不错的疯狂壳管道实际执行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对我的错误提醒,让我重温我的解决方案。
酷!我不知道粘贴命令。 – Ben
你的输出OP的 – user000001
Oooops一个细微之处user000001不匹配 - 也许我能得到OP改变他的问题:( - !我得重新考虑 – sotapme
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
>
工作完全正常,但相同的逗号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 –
这可能为你工作:
pr -tT3 -s\ file | sed \$d
使用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
[你有什么试过吗?](http://mattgemmell.com/2008/12/08/what-have-you-tried/) –
我只是试图修复你的格式,请检查现在发布的内容是什么样的完全像你的真实文件,包括那些只有2个逗号的行。 –