结果

结果

我有一个 csv 文件,每行大约 2000 列,我需要将其分割为 6 列。切片后,应将切片堆叠起来。

例如:

A1,B1,C1,D1,E1,F1,A2,B2,C2,D2,E2,F2
G1,H1,I1,J1,K1,L1,G2,H2,I2,J2,K2,L2

会变成:

A1,B1,C1,D1,E1,F1
G1,H1,I1,J1,K1,L1
A2,B2,C2,D2,E2,F2
G2,H2,I2,J2,K2,L2

我如何从 shell 命令行执行此操作?

答案1

我怀疑你能否在一个进程中有效地做到这一点,所以我建议做一个像这样的循环

for (( i=1 ; i < 2000; i+=6 )); do
  j=$((i+5))
  cut -d, -f $i-$j your.csv
done

答案2

Python解决方案:

输入文件示例test.csv

A1,B1,C1,D1,E1,F1,A2,B2,C2,D2,E2,F2,A3,B3,C3,D3,E3,F3,A4,B4,C4,D4,E4,F4
G1,H1,I1,J1,K1,L1,G2,H2,I2,J2,K2,L2,G3,H3,I3,J3,K3,L3,G4,H4,I4,J4,K4,L4

slice_on_6.py脚本:

import sys, csv
with open(sys.argv[1], 'r') as fh:  # opening csv file
    reader = list(csv.reader(fh))   # reader object which will iterate over lines in the given csvfile
    cnt = len(reader[0])//6         # number(count) of slices
    for i in range(cnt):
        for l in reader:
            print(','.join(l[i*6:6*(i+1)]))  # outputting each slice from each line consecutively

用法:

python slice_on_6.py test.csv

输出:

A1,B1,C1,D1,E1,F1
G1,H1,I1,J1,K1,L1
A2,B2,C2,D2,E2,F2
G2,H2,I2,J2,K2,L2
A3,B3,C3,D3,E3,F3
G3,H3,I3,J3,K3,L3
A4,B4,C4,D4,E4,F4
G4,H4,I4,J4,K4,L4

答案3

您可以尝试使用sed所示的工具:基本主题是,作为第一步,我们在模式空间中读取文件。

接下来,我们分配前 6 个元素,然后打印该部分并将该线移动到图案空间的后面(在锯掉打印部分之后)。

对图案空间中现在的引导线进行冲洗并重复上述过程。

当模式空间只剩下最后一行的最后一部分时,这个过程就会停止,此时我们只需sed在去掉前导换行符后将其打印出来。

这些部分是 6 个 csv 字段,每行中的字段总数是 6 的整数倍,并且每行具有相同的字段数。

sed -e '
   $!{
      s/$/,/
      N;s/^/\n/;D
   }

   s/^\([^,]*,\n\{0,1\}\)\{6\}/&\n/
   s/\n\n/\n/
   s/,\n/\n/

   P

   y/\n_/_\n/
   s/^[^_]*_//
   s/^\([^_]*\)_\(.*\)/_\2_\1/
   y/\n_/_\n/

   /\n.*\n/D
   s/.*\n//
' yourfile.csv

结果

A1,B1,C1,D1,E1,F1
G1,H1,I1,J1,K1,L1
A2,B2,C2,D2,E2,F2
G2,H2,I2,J2,K2,L2

答案4

总有令人尊敬的rs

rs -c, -T < file.csv | split -l6 --filter='rs -C, -T'
A1,B1,C1,D1,E1,F1,
G1,H1,I1,J1,K1,L1,
A2,B2,C2,D2,E2,F2,
G2,H2,I2,J2,K2,L2,

要删除尾随分隔符,您可以通过管道sed 's/,$//'

rs -c, -T < file.csv | split -l6 --filter='rs -C, -T' | sed 's/,$//'
A1,B1,C1,D1,E1,F1
G1,H1,I1,J1,K1,L1
A2,B2,C2,D2,E2,F2
G2,H2,I2,J2,K2,L2

FWIW我不知道为什么rs要添加尾随分隔符;它有一个选项

-m      Do not trim excess delimiters from the ends of the output array.

这表明默认值应该将其删除。

相关内容