我尝试执行以下操作一段时间但没有成功。
我收到的数据在每个单独的列中都有逗号分隔的值。第 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]
在第二个语句中忽略索引,该语句将map
s into 和split
s[5..*]
的后一个“协变”列@split1
(这次以,
逗号分隔)来创建@split2
数组。
前缀[Z]
Zip-reduction 运算符去掉@split2
数组的每个元素,有效地转置元素(以便A1
和B1
相邻,等等)。最后,行出来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