您好我有一个带有以下条目的csv文件
11
22
13
,,
aa
bb
cc
,,
ww
kk
ll
,,
请建议我一个linux命令或脚本,它可以将这个colomun分成同一个文件中的3列,如下所示
11 aa ww
22 bb kk
13 cc ll
答案 0 :(得分: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
答案 1 :(得分: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对我的错误提醒,让我重新审视我的解决方案。
答案 2 :(得分: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
>
答案 3 :(得分:0)
这可能对您有用:
pr -tT3 -s\ file | sed \$d
答案 4 :(得分: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