透视文件值

透视文件值

我有一个文件,其中第一列是关键。行最多可以有 2800 个分隔符。我需要将数据从行转到列。以下是示例输入和所需的输出。

源文件

123,A,B,,,,AC,DF,,,,,,,,,,,,n 
567,A,B,,C,D,,,,,,,,, 7
89,C,B

输出

123,A
123,B
123,
123,
.
.
123,AC
123,DF
567,A
567,B
567,C
567,D
567,7
89,C
89,B

请指教。

答案1

使用米勒(http://johnkerl.org/miller/doc/) 和

mlr --nidx --fs "," reshape -r '[^1]' -o item,value \
then filter -S -x '$value==""' \
then cut -f 1,value input.txt

你有

123,A
123,B
123,AC
123,DF
123,n
567,A
567,B
567,C
567,D
567, 7
89,C
89,B

如果你还想要空值是

mlr --nidx --fs "," reshape -r '[^1]' -o item,value \
then cut -f 1,value input.txt

你将会有

123,A
123,B
123,
123,
123,
123,AC
123,DF
123,
123,
123,
123,
123,
123,
123,
123,
123,
123,
123,n
567,A
567,B
567,
567,C
567,D
567,
567,
567,
567,
567,
567,
567,
567, 7
89,C
89,B

答案2

$ cat file
123,A,B,,,,AC,DF,,,,,,,,,,,,n
567,A,B,,C,D,,,,,,,,, 7
89,C,B
$ awk -F, 'BEGIN { OFS = FS } { for (i = 2; i <= NF; ++i) if ($i != "") print $1, $i }' file
123,A
123,B
123,AC
123,DF
123,n
567,A
567,B
567,C
567,D
567, 7
89,C
89,B

这假设数据位于简单的不需要任何引号的 CSV 格式(任何字段中都没有嵌入逗号或换行符)。该awk代码只是从字段 2 开始迭代每行的逗号分隔字段,并将它们与新行的第一个字段一起打印。空字段将被忽略。如果您不想忽略空字段(问题中不清楚),请删除if ($i != "")代码中的该位。

相关内容