Linux在同一CSV文件中将一列分为两个不同的列[关闭]

问题描述 投票:3回答:5

嗨,我有一个csv文件,其中包含以下条目

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

请向我建议一个Linux命令或脚本,该命令或脚本可以将此colomun分成同一文件中的3列,如下所示

11  aa  ww
22  bb  kk
13  cc  ll
linux bash shell sed awk
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

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对我的错误让我重新审视我的解决方案。


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
投票

这可能对您有用:

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

0
投票

with 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
© www.soinside.com 2019 - 2024. All rights reserved.