处理不同列中具有逗号分隔值的表

处理不同列中具有逗号分隔值的表

我尝试执行以下操作一段时间但没有成功。

我收到的数据在每个单独的列中都有逗号分隔的值。第 6 列中逗号之前的第一个值始终与第 7 列中逗号之前的第一个值相关。我想提取数据并按正确的顺序将它们放入表中,如下所示:

输入数据:

1 2 3 4 5 A1,A2 B1,B2
1 7 3 3 5 C1,C2,C3 D1,D2,D3
1 2 R 4 b E1,E2,E3,E4 G1,G2,G3,G4

输出数据:

1 2 3 4 5 A1 B1
1 2 3 4 5 A2 B2
1 7 3 3 5 C1 D1 
1 7 3 3 5 C2 D2
1 7 3 3 5 C3 D3
1 2 R 4 b E1 G1
1 2 R 4 b E2 G2
1 2 R 4 b E3 G3
1 2 R 4 b E4 G4

我知道我需要在\t将它们放入排序数组之前将它们分开,但我对此完全陌生并且收到了如此庞大的数据。

答案1

awk

awk '{split($6,a,","); split($7,b,","); for(i in a){print $1,$2,$3,$4,$5,a[i],b[i]}}' file
  • awk读取输入空格或制表符分隔,默认:[\t ]+
  • split($6,a,",")将第 6 个字段$6以逗号分隔,,并将输出存储在名为 的数组中a
  • split($7,b,",")$7用逗号分隔第七个字段,,并将输出存储在名为 的数组中b
  • for(i in a)现在循环数组a...
    • print ...,a[i],b[i]...并将值打印$1$5两个数组值a[i]以及b[i]它们的索引i

输出:

1 2 3 4 5 A1 B1
1 2 3 4 5 A2 B2
1 7 3 3 5 C1 D1
1 7 3 3 5 C2 D2
1 7 3 3 5 C3 D3
1 2 R 4 b E1 G1
1 2 R 4 b E2 G2
1 2 R 4 b E3 G3
1 2 R 4 b E4 G4

答案2

使用(以前称为 Perl_6)

~$ raku -ne 'my @split1 = .split(/ \s+ /); 
             my @split2 = @split1.[5..*].map: .split(","); 
             for [Z] @split2 { put (@split1[0..4], $_).join("\t") };'  file.txt

Raku 是 Perl 家族的一种编程语言。有些CSV模块可以处理复杂的 CSV 文件(多行标题、嵌入式换行符等)。以上是不加载外部模块的答案。

-ne该代码通过(非自动打印,逐行)标志引导逐行读取文件。第一个split打破空白以创建 array @split1。由于在每行的开头给出了 5 个“数据”列,因此[0..4]在第二个语句中忽略索引,该语句将maps into 和splits[5..*]的后一个“协变”列@split1(这次以,逗号分隔)来创建@split2数组。

前缀[Z]Zip-reduction 运算符去掉@split2数组的每个元素,有效地转置元素(以便A1B1相邻,等等)。最后,行出来put,“数据”列和“协变”列相邻,join根据需要进行编辑。

输入示例:

1 2 3 4 5 A1,A2 B1,B2
1 7 3 3 5 C1,C2,C3 D1,D2,D3
1 2 R 4 b E1,E2,E3,E4 G1,G2,G3,G4

示例输出:

1 2 3 4 5   A1 B1
1 2 3 4 5   A2 B2
1 7 3 3 5   C1 D1
1 7 3 3 5   C2 D2
1 7 3 3 5   C3 D3
1 2 R 4 b   E1 G1
1 2 R 4 b   E2 G2
1 2 R 4 b   E3 G3
1 2 R 4 b   E4 G4

https://docs.raku.org/routine/split
https://docs.raku.org/language/operators#Reduction_metaoperators
https://raku.org

相关内容